• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++之匿名对象与析构函数的关系

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
#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;
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap