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

两段含拷贝构造、赋值运算符的C++代码驱动一致输出不同,为何代码2赋值时多调拷贝构造

C++代码输出差异原因解答

核心触发原因

代码2的赋值操作会额外触发拷贝构造,本质是两个代码的赋值运算符参数传递规则不同:

  • 代码1的赋值运算符定义为 void operator = (const A& obj),形参是常量左值引用,引用传参不需要生成实参副本,因此调用时不会触发拷贝构造。
  • 代码2的赋值运算符定义为 anyArrayClass& operator=(anyArrayClass obj),形参是值类型,C++中为值类型的自定义类形参传递实参时,会自动调用拷贝构造函数生成实参的副本作为形参,因此执行obj3 = obj1时,首先会调用拷贝构造生成形参obj,之后才会执行赋值运算符内部的逻辑。

设计背景说明

这种传值写法是C++ copy-and-swap(拷贝并交换) 惯用法的标准实现,优势包括:

  • 不需要手动在赋值运算符内部实现重复的拷贝逻辑,复用拷贝构造函数的代码
  • 天然保证异常安全:如果拷贝构造阶段抛出异常,原对象的资源不会被修改,不会出现半修改的无效状态
  • 形参在赋值函数执行结束后自动析构,会顺带释放原对象的旧资源,不需要手动处理旧资源释放

内容的提问来源于stack exchange,提问作者Sachin Palande

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:36:08