知识点讲解

  1. 使用对象 a1 给对象 a2 赋值时。
classA a1;
classA a2 = a1;
  1. 使用对象 a1 构造对象 a2 时。
classA a1;
classA a2(a1);
  1. 实参初始化形参时。
func(classA a){……}
func(a1);
  1. 返回值是对象类型时,会调用拷贝构造函数生成一个匿名对象。
classA func() 
{
    classA t;
    return t;
}

参数为 引用 或 指针 类型调用时,不会调用拷贝构造函数

返回值为 引用 或 指针类型时,不会调用拷贝构造构造函数

https://www.cnblogs.com/yangguang-it/p/6408275.html

图1 拷贝构造函数调用情况总结


练习题目

运行以下代码,一共调用了多少次拷贝构造函数?

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

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

最后修改:2021 年 05 月 29 日 02 : 26 PM
如果觉得我的文章对你有用,请随意赞赏