C++对象实例化与赋值
C++对象实例化与赋值
这两者之间有什么区别:
TestClass t;
和这个:
TestClass t = TestClass();
我本来以为第二个会调用两次构造函数,然后调用 operator=,但实际上它只调用了一次构造函数,就像第一个一样。
admin 更改状态以发布 2023年5月23日
第一种情况非常简单——使用默认构造函数构造一个实例。
第二种情况是构造一个匿名对象,然后调用复制构造函数。请注意,这里的=
不是赋值,它类似于(但不是相同)写作:
TestClass t(TestClass());
我们可以通过使其无效来验证这需要可用的复制构造函数,例如:
#includestruct TestClass { TestClass() { std::cout << "Ctor" << std::endl; } TestClass(const TestClass&) = delete; }; int main() { TestClass t = TestClass(); }
由于删除了复制构造函数,因此无法编译此代码(在C++03中,可以使用private:
代替)。
实际上最有可能发生的情况是,您的编译器正在执行返回值优化,只要存在并且可访问合适的复制构造函数,就可以省略对它的调用。