需要析構函式的類也需要拷貝和賦值操作

2021-07-03 02:30:44 字數 1647 閱讀 8281

如果乙個類需要析構函式,幾乎可以肯定它也需要乙個拷貝建構函式和乙個拷貝賦值運算子。

以下討論原因。

1沒有拷貝拷貝建構函式和拷貝賦值運算子的情況

(1)main中拷貝初始化物件的情況

結果表明:

當類中需要自定義析構函式時,如果沒有自定義拷貝建構函式,而是使用預設合成建構函式(合成拷貝建構函式)。main 函式中拷貝構造時,只會簡單的拷貝指標的值,也就是說,兩個物件的指標會指向同乙個位址。這樣在析構時就會呼叫兩次析構函式,對同乙個位址進行指標銷毀,出現錯誤。

(2)函式呼叫的情況

在函式呼叫時,簡單的拷貝指標,析構時指標釋放兩次,出錯!

2.加入自定義拷貝建構函式和拷貝賦值運算子

(1)兩種情況分開看結果

(2)第二種情況

分析:加入拷貝建構函式和拷貝賦值運算子後,問題解決。

過程問題分析:

1.在上述f()呼叫時,可以看到,實參傳入拷貝構造一次,函式內部建立乙個物件拷貝構造一次,return 返回時再次拷貝, 總共三次。

因此,析構的時候應該拷貝三次。

ios gles需要析構函式,析構函式報錯

參考 inte ce person nsobject void dealloc 宣告析構函式,析構函式只能有乙個 end implementation person 實現person 類 void dealloc end person xiaoming person alloc xiaoming r...

為什麼需要虛析構函式

這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。class clxbase virtual clxbase virtual void dosomething class clxderived public clxbase clxderived void dosomet...

編寫類String的建構函式 析構函式和賦值函式

編寫類string的建構函式 析構函式和賦值函式,已知類string的原型為 class string public string const char str null 普通建構函式 string const string other 拷貝建構函式 string void 析構函式 string ...