You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者蔡天意

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:42:12