Int a = 0 и int a (0) различия
Возможный дубликат:
Есть ли разница в С++ между инициализацией и прямой инициализацией?
Я только начал изучать С++.
Чтобы инициализировать переменную со значением, я наткнулся на
int a = 0;
и
int a(0);
Меня это смущает. Могу ли я узнать, что является лучшим способом?
Ответы
Ответ 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
В учебниках и литературе одна из них является прямой инициализацией, а другая - инициализацией копирования. Но, с точки зрения машинного кода, нет никакой разницы.