#include<iostream>
using namespace std;
class location
{
public:
location(int xx=0,int yy=0)
{
X=xx;Y=yy;
cout<<"Constructor Object.\n";
}
//copy构造函数,用一个对象完成对另一个对象的初始化
location(const location& obj)
{
X=obj.X;Y=obj.Y ;
cout<<"Copy_constructor called"<<endl;
}
~location()
{
cout<<"X:"<<X<<","<<"Y:"<<Y<<" "<<"Object destoryed,"<<endl;
}
int GetX()
{
return X;
}
int GetY()
{
return Y;
}
private:
int X,Y;
};
//g()函数返回一个元素
//结论1:函数的返回值是一个元素(复杂类型的),返回的是一个新的匿名对象(所以会调用匿名对象类的copy构造函数)
//这样写代码,设计编译器的大牛们 :
//我就给你返回一个新对象(没有名字)
//结论2:有关匿名对象的去和留
//如果用匿名对象初始化另外一个同类型的对象,那么匿名对象直接就转成有名对象
//如果用匿名对象赋值给另外同类型的对象,那么匿名对象直接被析构
location g()
{
location A(1,2);
return A;
}
void playobj1()
{
g();
}
//匿名对象的第一种接法
void playobj2()
{
//用匿名对象初始化m,此时C++编译器直接把这个匿名对象转成m(扶正)。从匿名转成有名字了,名字就是m
//
location m=g();//因为提前吧匿名对象的内存搞出来了,所以这次初始化是不会调用copy构造函数。
printf("匿名对象被扶正,不会析构掉\n");
cout<<m.GetX() <<endl;
}
//匿名对象的第二种接法
void platobj3()
{
location m2(1,2);
m2=g();
printf("匿名对象被析构\n");//因为用匿名对象=给m2,所以匿名对象被析构
cout<<m2.GetX() <<endl;
}
int main()
{
playobj1();
playobj2();
platobj3();
cout<<"hello"<<endl;
return 0;
}
函数返回值是匿名对象去和留的剖析
最新推荐文章于 2023-09-14 21:45:00 发布