#include <iostream>
using namespace std;
class Location{
public:
Location(int xx = 0, int yy = 0){
X = xx; Y = yy; cout << "Constructor Object.\n";
}
Location(const Location& obj){//copy构造函数
X = obj.X;
Y = obj.Y;
}
~Location(){
cout << X << "," << Y <<" "<< "Object destroyed." << endl;
}
int GetX(){ return X; }
int GetY(){ return Y; }
private:
int X;
int Y;
};
//g()返回一个元素
//结论1:函数的返回值是一个元素(复杂类型),返回的是一个新的匿名对象(所以会调用匿名对象类的copy构造函数)
//
//结论2:匿名对象的去和留
//如果用匿名对象初始化 另外一个同类型的对象,匿名对象转成有名对象
//如果用匿名对象赋值给 另外一个同类型的对象,匿名对象被析构
Location g(){
Location A(1, 2);
return A;//A是一个局部变量,当生命周期完毕,会调用析构函数释放空间。此时新建了一个匿名对象来接返回值,因此会调用匿名对象类的复制构造函数,相当于A来初始化匿名对象
}
void playobj01(){
cout << "playobj01执行开始\n" << endl;
g();//匿名对象会被析构掉;
printf("匿名对象会析构掉\n");
cout << "playobj01执行完毕\n" << endl;
}
void playobj02(){
cout << "playobj02执行开始\n" << endl;
//用匿名对象初始化m 此时c++编译器 直接把匿名对象转成了m
Location m = g();
printf("匿名对象被转正,不会析构掉\n");//速度就会加快
cout << m.GetX() << endl;
cout << "playobj02执行完毕\n" << endl;
}
void playobj03(){
cout << "playobj03执行开始\n" << endl;
Location m2(1, 2);
m2 = g();
printf("因此用匿名对象赋值给m2,匿名对象被析构掉\n");
cout << m2.GetX() << endl;
cout << "playobj03执行完毕\n" << endl;
}
int main()
{
playobj01();
playobj02();
playobj03();
system("pause");
return 0;
}
以上转载自:https://www.cnblogs.com/fuao2000/p/11065594.html
在这我再补充一个点:
如果说把
Location g(){ Location A(1, 2); return A; }
将上的代卖改为如下:
Location g(){ return Location(1,2);//直接返回一个匿名对象 }
通过直接返回一个匿名对象,通过检测会发现少调用一次析构函数,个人认为应该是因为返回的是一个匿名对象所以说在函数g()调用结束后不会创建一个匿名对象来接收返回值,自然就少一次析构函数的调用。