先給一個類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)執行完後,銷燬,使用析構