知识点讲解
- 使用对象 a1 给对象 a2 赋值时。
classA a1;
classA a2 = a1;
- 使用对象 a1 构造对象 a2 时。
classA a1;
classA a2(a1);
- 实参初始化形参时。
func(classA a){……}
func(a1);
- 返回值是对象类型时,会调用拷贝构造函数生成一个匿名对象。
classA func()
{
classA t;
return t;
}
参数为 引用 或 指针 类型调用时,不会调用拷贝构造函数
返回值为 引用 或 指针类型时,不会调用拷贝构造构造函数
https://www.cnblogs.com/yangguang-it/p/6408275.html
练习题目
运行以下代码,一共调用了多少次拷贝构造函数?
Widget f(Widget u)
{
Widget v(u);
Widget w=v;
return w;
}
void main()
{
Widget x;
Widget y=f(f(x));
}
答案
调用了 7 次拷贝构造函数。
分析
第一次:f(x) 调用时,实参初始化形参时调用
第二次:Widget v(u) 时,使用对象 u 构造新对象 v 时
第三次:w=v 时,使用对象 v 给对象 w 赋值
第四次:return w 时,返回值是对象类型,生成一个匿名对象
f(f(x)) 调用外层的 f 函数实参形参结合时,上一步返回的匿名对象直接转正,不再调用拷贝构造函数。
第五次:调用外层 f 函数时,Widget v(u),调用拷贝构造函数
第六次:调用外层 f 函数时,w=v 调用拷贝构造函数
第七次:调用外层 f 函数时,return w 生成匿名对象
Widget y=f(f(x)) 外层 f 函数返回的匿名对象直接转正赋给了 y,不调用拷贝构造函数
拷贝构造函数调用的几种情况都覆盖了,以及几种特殊的不调用拷贝构造函数的情况也考察到了,值得好好收藏回顾。