#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; }
觉得一般来说,函数返回值除了等号重载,最好不要用引用返回,以免带来不必要的复杂