1.100、什么情况下会调用拷贝构造函数
拷贝构造函数是C++中用于用一个同类型对象初始化另一个对象的特殊构造函数,调用时机主要有以下四种典型场景:
1. 用已有对象初始化新对象(直接初始化或拷贝初始化)
A a1;
A a2 = a1; // 拷贝初始化,调用拷贝构造函数
A a3(a1); // 直接初始化,调用拷贝构造函数
这里是最常见的调用场景,创建新对象时用已有对象进行初始化。
2. 函数传参时按值传递对象
void func(A p) { /*...*/ }
A a;
func(a); // 形参p用实参a初始化,调用拷贝构造函数
函数调用时,实参对象拷贝构造形参对象。
3. 函数返回对象(返回值优化未生效时)
A func() {
A a;
return a; // 返回局部对象,通常调用拷贝构造函数生成返回值
}
A a2 = func(); // 用返回的匿名对象初始化a2,可能调用拷贝构造函数
函数返回局部对象时,会调用拷贝构造函数将局部对象拷贝(或移动)到调用者处,尽管现代编译器常做返回值优化(RVO)避免拷贝。
4. 用匿名对象初始化新对象(部分情况)
A a = A(); // 匿名临时对象用来初始化a,可能调用拷贝构造函数
但编译器通常会优化,直接构造,避免调用拷贝构造。
额外说明
- • 赋值操作(
=
)不调用拷贝构造函数,而调用赋值运算符重载。 - • 编译器优化(如RVO、拷贝消除)会减少实际调用次数。
- • 拷贝构造函数参数必须是对本类型的引用,通常是
const A&
。
总结
场景 | 是否调用拷贝构造函数 |
用已有对象初始化新对象 | 调用 |
函数按值传参 | 调用 |
函数返回对象(无优化时) | 调用 |
匿名对象初始化新对象(无优化时) | 可能调用 |
赋值操作 | 不调用,调用赋值运算符重载 |
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1935
文章版权归作者所有,未经允许请勿转载。
THE END