什么时候调用拷贝构造函数

  1. 使用对象 a1 给对象 a2 赋值时。
classA a1;
classA a2 = a1;

2. 使用对象 a1 构造对象 a2 时。

classA a1;
classA a2(a1);

3. 实参初始化形参时。

func(classA a){……}
func(a1);

4. 返回值是对象类型时,会调用拷贝构造函数生成一个匿名对象。

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,不调用拷贝构造函数

拷贝构造函数调用的几种情况都覆盖了,以及几种特殊的不调用拷贝构造函数的情况也考察到了,值得好好收藏回顾。

Related Post

发表评论

电子邮件地址不会被公开。 必填项已用*标注