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

来源:互联网 发布:fanuc编程软件 编辑:程序博客网 时间:2024/06/18 02:39

当一个函数返回值是一个对象时,返回的是一个匿名对象(所以会调用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;}
0 0
原创粉丝点击