C++学习——copy构造函数所涉及匿名对象的问题

当一个函数返回值是一个对象时,返回的是一个匿名对象(所以会调用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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值