1.100、什么情况下会调用拷贝构造函数

拷贝构造函数是C++中用于用一个同类型对象初始化另一个对象的特殊构造函数,调用时机主要有以下四种典型场景:


1. 用已有对象初始化新对象(直接初始化或拷贝初始化)

A a1;
A a2 = a1;    // 拷贝初始化,调用拷贝构造函数
a3(a1);     // 直接初始化,调用拷贝构造函数

这里是最常见的调用场景,创建新对象时用已有对象进行初始化。


2. 函数传参时按值传递对象

void func(A p) /*...*/ }
A a;
func(a);     // 形参p用实参a初始化,调用拷贝构造函数

函数调用时,实参对象拷贝构造形参对象。


3. 函数返回对象(返回值优化未生效时)

func() {
    A a;
    return a;   // 返回局部对象,通常调用拷贝构造函数生成返回值
}

A a2 = func();  // 用返回的匿名对象初始化a2,可能调用拷贝构造函数

函数返回局部对象时,会调用拷贝构造函数将局部对象拷贝(或移动)到调用者处,尽管现代编译器常做返回值优化(RVO)避免拷贝。


4. 用匿名对象初始化新对象(部分情况)

A a = A();  // 匿名临时对象用来初始化a,可能调用拷贝构造函数

但编译器通常会优化,直接构造,避免调用拷贝构造。


额外说明

  • • 赋值操作(=)不调用拷贝构造函数,而调用赋值运算符重载。
  • • 编译器优化(如RVO、拷贝消除)会减少实际调用次数。
  • • 拷贝构造函数参数必须是对本类型的引用,通常是const A&

总结

场景 是否调用拷贝构造函数
用已有对象初始化新对象 调用
函数按值传参 调用
函数返回对象(无优化时) 调用
匿名对象初始化新对象(无优化时) 可能调用
赋值操作 不调用,调用赋值运算符重载

本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

阅读剩余
THE END