两段含拷贝构造、赋值运算符的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
相关产品推荐
相关产品推荐

