zoukankan      html  css  js  c++  java
  • C++ 匿名对象初始化新对象

    //c++中匿名对象初始化新对象
    #include<iostream>
    using namespace std;
    
    class Point{
    public:
        Point(){
            cout << "我是自定义的无参构造函数1" << endl;
        }
        Point(Point &pm){
            cout << "我是自定义的拷贝构造函数3" << endl;
        }
        ~Point(){
            cout << "我是自定义的析构函数2" << endl;
        }
    private:
        int x;
        int y;
    };
    
    Point ProtectA(){
        Point p1;//注意:此时p1对象在栈中开辟内存空间,用了new关键字才会在堆上开辟内存空间
        //执行到16行代码---c++编译器调用p1的无参构造函数
        return p1;
        //执行到18行代码---c++编译器自动生成一个匿名对象,
        //调用这个匿名对象的拷贝构造函数(假设用户没有定义拷贝构造函数,并且用户已经定义了无参构造函数,那么c++编译器还是会自动生成一个拷贝构造函数//然后调用p1的析构函数
    }
    
    void ProtectB(){
        Point pt = ProtectA();
        //执行31行时,观察发现c++编译器不会调用pt的任何构造函数
        //本质上是c++编译器做了优化,当发现匿名对象初始化一个新对象时,会直接把这个匿名对象转成新对象
        //不会再去构造生成一个新对象--这是c++编译器为了效率上的考虑
    }
    //执行完ProtectB()会执行pt的析构函数
    
    void main(){
        ProtectB();
        system("pause");
    }

  • 相关阅读:
    python判断语句和循环语句
    Web项目如何做单元测试
    PHP接口自动化测试框架实现
    引入缺陷的原因都有哪些?
    测试基础:(一)
    测试基础(二)
    测试术语2
    测试术语3
    测试术语4
    Spring Cloud Stream与Spring Cloud Bus区别?
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5607612.html
Copyright © 2011-2022 走看看