1 返回值不是引用
#include<iostream>
using namespace std;
class A
{
public:
A()
{
cout << "default construct" << endl;
data = nullptr;
}
A(int x) {
cout << "construct" << endl;
data = new int(x);
}
A(const A& a)
{
cout << "copy construct" << endl;
this->data = a.data;
}
~A()
{
cout << "deconstruct" << endl;
delete data;
}
int* data;
};
A get()
{
return A(5);
}
int main()
{
A q = get();
printf("q.data is %d\n", *q.data);
return 0;
}
关闭编译器对临时对象的优化
g++ test.cpp -o test.exe -fno-elide-constructors -std=c++11
./test.exe
1. construct //创建无名对象 p = A()
2. copy construct //无名对象p拷贝构造无名临时对象tmp
3. destruct //局部变量无名对象p离开作用域析构
4. copy construct //无名临时对象tmp拷贝给a
5. destruct //无名临时对象tmp离开作用域(A a = get_A();)析构
6. q.data is 5 //赋值成功
7. destruct //主函数中a析构
2 返回引用
A& get()
{
//A p = A(5);
return A(1);//wrong A(1)是临时变量是右值,A&是非常量引用必须使用左值
}
A& get()
{
A p = A(5);
return p; //不能返回局部变量的引用
}
局部变量释放后,原内存即释放,再使用就会导致出错
因此,最好不要返回局部变量的引用