• C++ 匿名对象产生场景


    //匿名对象产生的三种场景
    #include<iostream>
    using namespace std;
    
    class Point{
    public:
        Point(int a,int b){
            cout << "有参构造函数被调用了1" << endl;
            this->x = a;
            this->y = b;
        }
        Point(Point &a1){
            cout << "拷贝构造函数被调用了2" << endl;
            this->x = a1.x;
            this->y = a1.y;
        }
        ~Point(){
            cout << "析构函数被调用了3" << endl;
            cout << "x=" << x << endl;
            cout << "y=" << y << endl;
        }
        Point Protset(int a){
            this->x = a;
            return *this;
            //执行 return *this; 会产生一个匿名对象,作为返回值
            //强调:如果返回值是引用,则不会产生匿名对象
        }
    
        Point Protset2(int a){
            Point temp(a, a);
            return temp;
            //执行 return temp;会先产生一个匿名对象,执行拷贝构造函数,作为返回值,
            //然后释放临时对象temp
        }
    
        //总结:函数返回值为一个对象(非引用)的时候会产生一个匿名对象,匿名对象根据主函数的操作决定生命周期
    
        Point& Protset3(int a){
            Point temp(a, a);
            return temp;
            //执行 return temp;不会产生匿名对象,而是会将temp的地址先赋值到引用中,
            //在释放temp的内存,此时Point&得到是一个脏数据
        }
    
        void PrintfA()const{
            cout << "x="<<x << endl;
            cout << "y=" << y << endl;
        }
    
    private:
        int x;
        int y;
    };
    
    
    void ProtectA(){
        //生成一个匿名对象,因为用来初始化另一个同类型的对象,这个匿名对象会直接转换成新的对象,
        //减少资源消耗
        Point p1 = Point(1,1);
        /*Point p2(2, 2);
        p2 = p1.Protset(3);
        p2.PrintfA();*/
        //观察发现p2打印出正确数据,因此得出结论p1.Protset(3);返回来一个匿名对象,
        //但是这个匿名对象执行完"="之后,才会被释放
        Point p4(5, 5);
        p4=p1.Protset2(4);
        p4.PrintfA();
    }
    
    void main(){
        ProtectA();
        system("pause");
    }
  • 相关阅读:
    罗马数字转整数-算法练习
    无重复字符的最长字串-算法练习
    亲密字符串-算法刷题笔记
    0-n-1中缺失的数字-算法总结笔记
    高度检查表-算法笔记总结
    链表删除中间结点-算法练习总结
    链表中的中间结点-算法练习总结
    链表相交-算法练习总结
    多数元素-算法笔记总结
    Consul Windows集群搭建ACL Token验证
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5625987.html
Copyright © 2020-2023  润新知