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