Подтвердить что ты не робот

Int a = 0 и int a (0) различия

Возможный дубликат:
Есть ли разница в С++ между инициализацией и прямой инициализацией?

Я только начал изучать С++.

Чтобы инициализировать переменную со значением, я наткнулся на

int a = 0;

и

int a(0);

Меня это смущает. Могу ли я узнать, что является лучшим способом?

4b9b3361

Ответ 1

int a = 0; и int a(0); не имеют никакого значения в коде, сгенерированном машиной. Они одинаковы.

Ниже приведен код сборки, сгенерированный в Visual Studio

int a = 10;   // mov dword ptr [a],0Ah  
int b(10);    // mov dword ptr [b],0Ah  

Ответ 2

Они оба одинаковы, поэтому на самом деле нет "лучшего способа".

Я лично использую

int a = 0;

потому что я нахожу его более понятным и более широко используемым на практике.

Это относится к вашему коду, где тип int. Для типов классов первая - это копирование-инициализация, тогда как другая - прямая инициализация, поэтому в этом случае это будет иметь значение.

Ответ 3

Нет "лучшего" способа. Для скалярных типов (например, int в вашем примере) обе формы имеют точно такой же эффект.

Синтаксис int a(0) для типов неклассов был введен для поддержки единого синтаксиса прямой инициализации для типов классов и неклассов, что очень полезно в не зависящем от типа (шаблоне) коде.

В коде без шаблона int a(0) не требуется. Вы полностью согласны с тем, хотите ли вы использовать синтаксис int a(0) или предпочитаете придерживаться более традиционного синтаксиса int a = 0. Оба делают то же самое. Последнее, по-моему, более читаемо.

Ответ 4

С практической точки зрения: я бы использовал только int a = 0;.

int a(0) может быть разрешен, но никогда не используется на практике сам по себе.


Я думаю, это не должно беспокоить вас на вашем уровне, но давайте двигаться дальше.

Скажем, что a - это класс, а не int.

class Demo{
public:
  Demo(){}; 
  Demo(int){};
};
Demo a;
Demo b(a);   
Demo c = a;  // clearly expressing copy-init

В этом примере оба b(a) и c=a делают то же самое, и я буду препятствовать вам использовать первое решение. Моя причина в том, что похожа на c(2), которая является конструкцией из аргументов.

В этой инициализации в стиле скобки используется только два действительных использования:

  • списки инициализации (Demo(int i):data(i){}, если у Demo есть член данных int data),
  • new's: Demo *p=new Demo(a); // copy constructing a pointer

Ответ 5

Это так просто. (Ну, почти - есть несколько вещей, которые вы не можете назвать своими переменными, о которых хорошо говорится в следующем разделе)

Вы также можете присваивать значения своим переменным при объявлении. Когда мы присваиваем значения переменной с помощью оператора присваивания (равно знаку), его называют явным присваиванием:

int a= 5; // explicit assignment

Вы также можете присваивать значения переменным, используя неявное присвоение:

int a(5); // implicit assignment

Несмотря на то, что неявные присваивания очень похожи на вызовы функций, компилятор отслеживает, какие имена являются переменными и какие функции, чтобы они могли быть правильно разрешены.

Ответ 6

Отличие состоит в том, что инициализация () заключается в том, что вы явно хотите, чтобы он принимал только один параметр, например:

Вы можете:
int a = 44 + 2;
но вы не можете:
int a(44) + 2;

Ответ 7

В учебниках и литературе одна из них является прямой инициализацией, а другая - инициализацией копирования. Но, с точки зрения машинного кода, нет никакой разницы.