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.以值方式返回局部對象只有深刻理解了構造函數、析構函數、複製函數的調用時機,咱們才能更好地把控程序的運行機制。
相關文章
相關標籤/搜索