函数返回值是类对象时调用复制构造函数?

调用复制构造函数的三种情况:

  1.当用类一个对象去初始化另一个对象时。

  2.如果函数形参是类对象。

  3.如果函数返回值是类对象,函数执行完成返回调用时。

#include <iostream>
using namespace std;
class Test{
public:
    Test(){ }
    //复制构造函数
    Test(const Test &t) {cout<< 1;}
};
//传参是对象的引用,不调用复制构造函数。
//传参是对象,调用复制构造函数。
Test fun1(Test &u)
{
    Test t=u; //初始化时用=号,就是Test t(u); 调用复制构造函数。而在赋值语句中的=号,不调用。像 Test x,y; x=y;
    return t; //返回值是对象,调用复制构造函数
}
Test& fun2(Test &u)
{
    Test t=u;
    return t; //返回值是对象的引用,不调用复制构造函数
}
Test fun3(Test u)
{
    Test t=u;
    return t; //返回值是对象,调用复制构造函数
}

int main()
{
    Test x,y;
    x=fun1(y);
    cout<< "
---------------
";
    x=fun2(y);
    cout<< "
---------------
";
    x=fun3(y);
    cout<<endl;
    return 0;
}

  vc6.0下的结果:

   VS2013下的结果:

  CodeBlock下的结果:(据说是gcc编译器把函数返回对象给优化了)就像 return Complex(2, 4); 优化了

 ------------------------------------------------------------------------------------------------------------------

可以参考:https://blog.csdn.net/sxhelijian/article/details/50977946

常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
原文地址:https://www.cnblogs.com/htj10/p/10181509.html