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");
}

 

posted on 2016-06-22 16:26  寒魔影  阅读(1505)  评论(0)    收藏  举报

导航