三种情况如下:
1.对象作为函数参数,以值传递的方式传入函数体。
2.对象作为函数返回值,以值传递的方式从函数反回。
3.对象用于给另一个对象进行初始化。
下面通过例题来解释上面的三种情况:
例题如下:
问题:上面的结果输出是?
答案如下
解析:
1、首先从 B t1 = Play(5) 开始 :
Play(5) 调用了构造函数2 和 一次拷贝构造函数和,编译时先把 实参5 通过传参给 Play(B b)函数的形参,即 B b = 5; ( 或者B b(5); )这样便调用了构造函数2。因为对象b 作为函数的返回值返回,满足了上面的调用构造函数的第二条,所以调用拷贝构造函数
注意1:当我们 B t1 ; 这样定义对象会默认调用构造函数1,但是上面的写法是接受返回值所以不会去调用构造函数1;
注意2:不要和第三条混淆了,第三条是一个对象给另一个对象赋值,不是接受函数返回值。例如: B t3 ; B t4 = t3; 这样满足第三条
2、下面解释B t1 = Play(t1) :
它调用了两次 拷贝函数,首先看 Play(t1) ,是把实参 t1 ,传给形参 ,即 B b = t1; 满足第三条,一个对象给另一个对象赋值,调用拷贝构造,因为返回参数传给t2,和上面一样,满足第二条,再次调用拷贝构造。