C++中Myclass obj2(obj1)与Myclass obj2=obj1两种构造写法有何差异?
关于C++拷贝初始化与直接初始化的差异澄清
首先明确结论:在C++标准语义下,以下两种写法没有本质差异,都不会创建临时对象,都是直接通过拷贝构造函数初始化新对象obj2。
两种写法的具体行为
直接初始化:
Myclass obj2(obj1);
这是最直观的拷贝构造调用方式,编译器直接调用Myclass的拷贝构造函数(签名通常为Myclass(const Myclass&)),用已有的obj1构造新对象obj2。拷贝初始化:
Myclass obj2 = obj1;
这种写法容易被误解为“先创建临时对象,再赋值给obj2”,但实际上按照C++标准,编译器会直接调用拷贝构造函数构造obj2,不会产生临时对象。即使早期编译器可能存在临时对象创建的行为,现代编译器也会通过拷贝消除优化跳过这一步,最终效果和直接初始化完全一致。
关键误区澄清
不要把拷贝初始化和赋值操作混淆:
- 只有当
obj2已经存在时,单独执行obj2 = obj1;才会调用拷贝赋值运算符(operator=(const Myclass&)),这是对已有对象的赋值操作。 - 而
Myclass obj2 = obj1;是对象的初始化过程,目标对象obj2此时还未创建,所以本质是构造而非赋值。
内容的提问来源于stack exchange,提问作者蔡天意
相关产品推荐
相关产品推荐

