当一个函数返回值是一个对象时,返回的是一个匿名对象(所以会调用copy构造函数)。
这个匿名对象在何时被创建,何时被析构需要弄清楚。
#include <iostream>
using namespace std;
class copyStruct{
int a;
int b;
public:
copyStruct(){}
copyStruct(int _a, int _b){
a = _a;
b = _b;
}
//copy构造函数,形参的实行必须是const Type& name
copyStruct(const copyStruct &cs){
a = cs.a;
b = cs.b;
}
~copyStruct()
{
cout<<"析构函数被调用"<<endl;
}
void printCS(){
cout<<a<<"——————————"<<b<<endl;
}
};
//函数返回值是一个元素(复杂类型的),返回的是一个匿名对象(所以会调用copy构造函数)
//匿名对象的去和留:
copyStruct gg()
{
copyStruct cs(1, 2);
return cs;
}
void objpaly2()
{
//gg()返回对象时会调用copy构造函数,创建一个匿名对象,所以会有两次析构,
//析构掉gg()中创建的对象和创建的匿名对象,而且会立即析构匿名对象。生命周期只是Line51这一行代码
//正是这个原因,构造函数中调用构造函数是个危险的行为
gg();
}
void objpaly3()
{
cout<<"************************************"<<endl;
//用匿名对象初始化cs,此时C++编译器直接把匿名对象转成cs;即转成有名对象
//相当于提前分配了内存只不过是匿名的,在使用时直接赋予一个名字;匿名对象不会被析构
copyStruct cs1 = gg();
cs1.printCS();
}
void objpaly4()
{
cout<<"************************************"<<endl;
//用匿名对象赋值给一个同类型的对象,然后匿名对象立即被析构
copyStruct cs2;
cs2 = gg();
cs2.printCS();
}
int main()
{
//objpaly();
objpaly2();
objpaly3();
objpaly4();
system("pause");
return 0;
}