在C ++中,
之间有什么区别吗?Object o;
o = Object(); // calling the class constructor
和
Object o = Object(); // one-line declaration and construction
与Java等其他语言相同吗? (除了语法)
答案 0 :(得分:7)
是的,有区别。
事实上,没有"双线声明&#34 ;;你的术语全部都是关闭的。我们来看看。
Object o;
o = Object();
这里你声明了一个对象o
,调用默认构造函数。然后,在下一行中,您使用默认构造函数创建了另一个对象(这个没有名称的对象),然后将分配给o
。非常浪费周围。
Object o = Object();
在这里,您声明了一个对象o
,使用另一个对象(这个没有名称的对象)调用复制构造函数。这个被称为"复制初始化",并且在这个例子中也非常浪费,尽管一个名为" copy elision"可以为你消除冗余。
你想要的是这个:
Object o;
这个默认构造一个名为o
的对象;问题解决了。
答案 1 :(得分:-1)
在第一种情况下,编译器生成一个构造函数的调用,然后第二次调用构造函数来创建第二个实例并使用复制或更多赋值运算符。在第二种情况下,编译器只生成一次构造函数调用。