int a = 0和int a(0)的区别
可能重复:
复制初始化和直接初始化在C ++中有区别吗?
我刚开始学习C ++。
为了用一个值初始化一个variables,我碰到了
int a = 0;
和
int a(0);
这使我困惑不已。 我可以知道哪个是最好的方法吗?
int a = 0;
和int a(0);
在机器生成的代码中没有任何区别。 他们是一样的。
以下是在Visual Studio中生成的汇编代码
int a = 10; // mov dword ptr [a],0Ah int b(10); // mov dword ptr [b],0Ah
他们都是一样的,所以真的没有人“最好的方式” 。
我个人使用
int a = 0;
因为我觉得它更清楚,在实践中被广泛使用。
这适用于你的代码,types是int
。 对于类types,首先是复制初始化,而另一个是直接初始化,所以在这种情况下,它会有所作为 。
没有“最好”的方法。 对于标量types(如你的例子中的int
),两个表单的效果完全相同。
引入了非类types的int a(0)
语法,以支持类和非类types的统一直接初始化语法,这在types无关的(模板)代码中非常有用。
在非模板代码中,不需要int a(0)
。 无论您想使用int a(0)
语法,还是更喜欢使用更传统的int a = 0
语法,完全取决于您。 两者都做同样的事情。 后者更可读,在我看来。
从实际的angular度来看:我只会用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
都是一样的,我会劝阻你使用第一个解决scheme。 我的理由是,这看起来类似于c(2)
这是一个从论点build构。
这种括号式初始化只有两个有效的用法 :
- 初始化列表(
Demo(int i):data(i){}
如果Demo有一个int数据成员data
), - 新的:
Demo *p=new Demo(a); // copy constructing a pointer
Demo *p=new Demo(a); // copy constructing a pointer
就这么简单。 (呃,差不多 – 有几件事情你不能说出你的variables的名字,我们将在下一节讨论)
您也可以在声明后将值分配给您的variables。 当我们使用赋值运算符(等号)将值赋给variables时,它被称为显式赋值:
int a= 5; // explicit assignment
您还可以使用隐式赋值将值分配给variables:
int a(5); // implicit assignment
即使隐式赋值看起来很像函数调用,编译器会跟踪哪些名称是variables,哪些是函数,以便可以正确parsing。
不同之处在于()
初始化是当你明确希望它只接受一个参数,例如:
您可以:
int a = 44 + 2;
但是你不能:
int a(44) + 2;
在教科书和文献中,一个是直接初始化,另一个是复制初始化。 但是,就机器码而言,没有什么区别。