首页 > 技术文章 > C++之匿名对象与析构函数的关系

abtious 2020-03-26 10:41 原文

原文链接: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.\n";
 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执行开始\n" << endl;
37     g();//匿名对象会被析构掉;
38     printf("匿名对象会析构掉\n");
39     cout << "playobj01执行完毕\n" << endl;
40 }
41  
42 void playobj02(){
43     cout << "playobj02执行开始\n" << endl;
44     //用匿名对象初始化m 此时c++编译器 直接把匿名对象转成了m
45     Location m = g();
46     printf("匿名对象被转正,不会析构掉\n");//速度就会加快
47     cout << m.GetX() << endl;
48     cout << "playobj02执行完毕\n" << endl;
49 }
50  
51 void playobj03(){
52     cout << "playobj03执行开始\n" << endl;
53     Location m2(1, 2);
54     m2 = g();
55     printf("因此用匿名对象赋值给m2,匿名对象被析构掉\n");
56     cout << m2.GetX() << endl;
57     cout << "playobj03执行完毕\n" << endl;
58 }
59  
60 int main()
61 {
62     playobj01();
63     playobj02();
64     playobj03();
65     system("pause"); 
66     return 0;
67 }

 

 总结:

    //本质上是c++编译器做了优化,当发现匿名对象初始化一个新对象时,会直接把这个匿名对象转成新对象
    //不会再去构造生成一个新对象--这是c++编译器为了效率上的考虑

推荐阅读