zoukankan      html  css  js  c++  java
  • C++之匿名对象与析构函数的关系

    #include <iostream>
     
    using namespace std;
     
    class Location{
    public:
        Location(int xx = 0, int yy = 0){
            X = xx; Y = yy; cout << "Constructor Object.
    ";
        }
        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执行开始
    " << endl;
        g();//匿名对象会被析构掉;
        printf("匿名对象会析构掉
    ");
        cout << "playobj01执行完毕
    " << endl;
    }
     
    void playobj02(){
        cout << "playobj02执行开始
    " << endl;
        //用匿名对象初始化m 此时c++编译器 直接把匿名对象转成了m
        Location m = g();
        printf("匿名对象被转正,不会析构掉
    ");//速度就会加快
        cout << m.GetX() << endl;
        cout << "playobj02执行完毕
    " << endl;
    }
     
    void playobj03(){
        cout << "playobj03执行开始
    " << endl;
        Location m2(1, 2);
        m2 = g();
        printf("因此用匿名对象赋值给m2,匿名对象被析构掉
    ");
        cout << m2.GetX() << endl;
        cout << "playobj03执行完毕
    " << endl;
    }
     
    int main()
    {
        playobj01();
        playobj02();
        playobj03();
        system("pause"); 
        return 0;
    }

  • 相关阅读:
    Docker 设置阿里云镜像
    Linux 安装Navicat Premium 15
    Ubuntu常用工具安装
    Docker安装MongoDB、MySQL、Jenkins、Gitlab、Nginx
    Ubuntu18.04修改apt-get源
    Spring定时任务
    Quartz学习总结
    cron表达式
    将VirtualBox里安装的虚拟机在后台运行方法(在状态栏隐藏窗口)
    npm小结
  • 原文地址:https://www.cnblogs.com/fuao2000/p/11065594.html
Copyright © 2011-2022 走看看