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 }

运行结果:ios

consructor
consructor
copy
func
destructor
test
copy
destructor
after test
destructor
destructor函数

 

调用步骤:spa

输出结果   具体跳转执行行数   操做
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)建立code

注意:删除的是临时对象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建立

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

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