C++构造函数、复制函数、析构函数调用详解

 1 #include <iostream>
 2 using namespace std;
 3 class Demo {
 4 public:
 5     Demo() { cout << "consructor" << endl; };
 6     ~Demo() { cout << "destructor" << endl; }
 7     Demo(Demo& obj) { cout << "copy" << endl; }
 8 };
 9 void Func(Demo obj) {
10     cout << "func" << endl;
11 }
12 Demo d1;
13 Demo Test() {
14     cout << "test" << endl;
15     return d1;
16 }
17 int main() {
18     Demo d2;
19     Func(d2);
20     Test();
21     cout << "after test" << endl;
22     return 0;
23 }

运行结果:

consructor
consructor
copy
func
destructor
test
copy
destructor
after test
destructor
destructor

 

调用步骤:

输出结果   具体跳转执行行数   操作
consructor row 12 -> row 5 创建Demo类对象d1
consructor row 18 -> row 5 创建Demo类对象d2
copy   row 7   -> row 7 d2作为参数被Func调用,执行复制函数将d2复制给obj
func row 10 进入Func函数
destructor row 19 -> row 6

销毁Demo类对象obj,其由Func(d2)创建

注意:删除的是临时对象obj而不是d2

test row 14 进入Test函数
copy row 20 -> row 7 d1作为返回值被Test调用执行复制函数
destructor row 20 -> row 6 销毁Demo类对象obj,其由Test()创建
after test row 21  
destructor row 12 -> row 6 销毁Demo类对象d1,其由row 12创建
destructor row 18 -> row 6 销毁Demo类对象d2,其由row 18创建

 事实证明关键之处还是在于复制函数的调用时机:

  • 1.使用一个已经创建完毕的对象来初始化一个新对象
  • 2.值传递的方式给函数参数传值
  • 3.以值方式返回局部对象
    只有深入理解了构造函数、析构函数、复制函数的调用时机,我们才能更好地把控程序的运行机制。

posted on 2021-02-18 12:42  rebel3  阅读(82)  评论(0编辑  收藏  举报

导航