原文链接:https://www.cnblogs.com/fuao2000/p/11065594.html
只是转发学习!!
1 #include <iostream> 2 3 using namespace std; 4 5 class Location{ 6 public: 7 Location(int xx = 0, int yy = 0){ 8 X = xx; Y = yy; cout << "Constructor Object. "; 9 } 10 Location(const Location& obj){//copy构造函数 11 X = obj.X; 12 Y = obj.Y; 13 } 14 ~Location(){ 15 cout << X << "," << Y <<" "<< "Object destroyed." << endl; 16 } 17 int GetX(){ return X; } 18 int GetY(){ return Y; } 19 private: 20 int X; 21 int Y; 22 }; 23 24 //g()返回一个元素 25 //结论1:函数的返回值是一个元素(复杂类型),返回的是一个新的匿名对象(所以会调用匿名对象类的copy构造函数) 26 // 27 //结论2:匿名对象的去和留 28 //如果用匿名对象初始化 另外一个同类型的对象,匿名对象转成有名对象 29 //如果用匿名对象赋值给 另外一个同类型的对象,匿名对象被析构 30 Location g(){ 31 Location A(1, 2); 32 return A;//A是一个局部变量,当生命周期完毕,会调用析构函数释放空间。此时新建了一个匿名对象来接返回值,因此会调用匿名对象类的复制构造函数,相当于A来初始化匿名对象 33 } 34 35 void playobj01(){ 36 cout << "playobj01执行开始 " << endl; 37 g();//匿名对象会被析构掉; 38 printf("匿名对象会析构掉 "); 39 cout << "playobj01执行完毕 " << endl; 40 } 41 42 void playobj02(){ 43 cout << "playobj02执行开始 " << endl; 44 //用匿名对象初始化m 此时c++编译器 直接把匿名对象转成了m 45 Location m = g(); 46 printf("匿名对象被转正,不会析构掉 ");//速度就会加快 47 cout << m.GetX() << endl; 48 cout << "playobj02执行完毕 " << endl; 49 } 50 51 void playobj03(){ 52 cout << "playobj03执行开始 " << endl; 53 Location m2(1, 2); 54 m2 = g(); 55 printf("因此用匿名对象赋值给m2,匿名对象被析构掉 "); 56 cout << m2.GetX() << endl; 57 cout << "playobj03执行完毕 " << endl; 58 } 59 60 int main() 61 { 62 playobj01(); 63 playobj02(); 64 playobj03(); 65 system("pause"); 66 return 0; 67 }
总结:
//本质上是c++编译器做了优化,当发现匿名对象初始化一个新对象时,会直接把这个匿名对象转成新对象 //不会再去构造生成一个新对象--这是c++编译器为了效率上的考虑