關於指針,對象週期,構造函數等的一些測試

先給一個類A: 

 

 

 

代碼一,構造與析構分別爲一次,而且析構爲在tmain主函數結束的時候進行

 

 

代碼二,構造執行一次(此外還執行了2次拷貝構造,編譯器會幫你實現一個拷貝構造函數,只是這個函數爲空的,什麼都不執行,可以自己寫個拷貝構造函數測試 ,A(const A&){ printf("copy structor ");} 。第一次拷貝構造在C(b)時執行,還有一次在 return a 時執行,因爲會產生一個臨時對象);

析構執行了三次,第一次析構爲  return a  的時候執行(是 a 對象 執行了此次析構),第二次第三次析構均爲tmain主函數結束後執行

 分別是d 和b ,這也從側面證實了前幾天看到的一個觀點,有些編譯器會讓d直接爲這個臨時對象,而不會在單獨創建d,然後把臨時對象複製給d,接着銷燬臨時對象(這裏困擾了好久,一直認爲過程應該爲紅色部分,這樣應該會有2次拷貝構造,一次是C(b),還有一次爲 A d= 的過程,突然想起前幾天看到的藍色字體觀點,才醒悟,太健忘了)

 

 

 代碼三,構造先執行兩次(分別爲 A b 與  A f ),然後拷貝構造函數執行了一次,析構爲三次

拷貝構造執行在 return f(產生了一個臨時對象) , 析構一次在 return f (對象 f 銷燬,執行了析構)時,還有兩次在tmain 快結束時執行; 

 

 

對於拷貝構造函數,來看下以下的說明:

 

在C++中,下面三種對象需要調用拷貝構造函數:

  1) 一個對象以值傳遞的方式傳入函數體;

  2) 一個對象以值傳遞的方式從函數返回;

  3) 一個對象需要通過另外一個對象進行初始化;

 

經測試發現 : 對於    A d = C(b);  這種形式,只執行兩次拷貝。不會因爲滿足1,2和3條件,執行3次拷貝構造。 具體原因就是

“有些編譯器會讓d直接爲這個臨時對象,而不會在單獨創建d,然後把臨時對象複製給d,接着銷燬臨時對象(這裏困擾了好久,一直認爲過程應該爲紅色部分,這樣應該會有2次拷貝構造,一次是C(b),還有一次爲 A d= 的過程,突然想起前幾天看到的藍色字體觀點,才醒悟,太健忘了)”這段話了

若就執行C(b),而不是 A d = C(b) ,則 產生的臨時對象會在函數C(b)執行完後,銷燬,使用析構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章