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