C++ 引用返回值

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class MyClass
{
public:
    static int num;
    int data;
    void DisplayData()
    {
        cout<<"Initializion"<<data<<"\n";
    }
    MyClass()
    {
        cout<<"MyClass Create\n";
        num++;
    }
    MyClass(const MyClass& r)
    {
        data=r.data;
        cout<<"MyClass Copy Create\n";
        num++;
    }
    ~MyClass()
    {
        num--;
        cout<<"MyClass Dispose\n";
    }
    MyClass operator=(const MyClass& r)
    {
        cout<<"operator=\n";
        return *this;
    }
};
int MyClass::num=0;
MyClass MakeClass1()
{
    MyClass P;
    P.data=10;
    return P;
}
void Test()
{
    MyClass temp1=MakeClass1();//用返回值初始化变量

    MyClass &temp=MakeClass1();
    temp.DisplayData();
    //根据C++标准,临时变量或对象在一个完整语句表达式后便宣告结束
    //某些编译器对C++进行了扩展,如果临时变量或对象作为引用初始化时,则其生命期与该引用一致
    //所以定义temp或者 &temp的结果一样,但是这样依赖编译器实现,最好应该:

    //MyClass x=MakeClass1();
    //MyClass & temp=x;

}

MyClass& MakeClass2()
{
    MyClass P;
    P.data=10;
    return P;
}
void Test2()
{
    //MyClass temp1=MakeClass2();//调用拷贝构造函数
    //temp1.DisplayData();//10

    MyClass &temp=MakeClass2();//调用正确,原因和Test1中一样,但不推荐使用
    temp.DisplayData();//10

}

void Test3()
{
    //=重载返回类型测试,=重载一般用引用返回,以免多调用一次拷贝构造函数
    MyClass c1;
    MyClass c2;
    MyClass c3;

    c1=c2=c3;
}
int main(int cnt,char *argv[])
{
    //Test();
    //Test2();
    Test3();
    cout<<MyClass::num<<endl;

    return 0;
}

觉得一般来说,函数返回值除了等号重载,最好不要用引用返回,以免带来不必要的复杂

原文地址:https://www.cnblogs.com/FlyCat/p/2838859.html