賦值運算子的過載函式基本可以確定為兩種寫法,一種是初級程式設計師的寫法,另外一種是高階程式設計師的寫法,下面將對賦值運算子的過載函式的兩種形式進行解析。
1、初級程式設計師的寫法
test& operator=(const test& src)
//防止記憶體丟失和淺拷貝
delete _ptr;
//此處存在問題
_ptr = new char[strlen(src._ptr)+1];
strcpy_s(_ptr, strlen(src._ptr)+1, src._ptr);
return *this;
}
注意:
此寫法存在問題,即 _ptr = new char[strlen(src._ptr)+1];存在問題。問題在於當考慮異常安全性的時候,之前的delete釋放了_ptr的記憶體,若此時的內部不足導致申請記憶體失敗丟擲異常,strcpy_s的時候就會導致程式崩潰。
2、高階程式設計師的寫法
test& operator=(const test& src)
return *this;
}
此**則很好的解決了上邊的問題,在上邊的**片中,我先建立了乙個tmp的test類的臨時物件,然後通過ptmp指標將tmp._ptr和(*this)._ptr的指向交換,這樣當整個函式指向完後區域性物件自動析構,這樣就能析構呼叫operator=()函式的物件的原有的記憶體,不會產生記憶體丟失,同時解決了異常安全性的問題。test的拷貝建構函式裡呼叫new分配記憶體,如果由於記憶體不足丟擲異常,則還沒有修改例項((*this)._ptr)的狀態,因此例項的狀態還是有效的。
另外,關於賦值運算子的過載函式的返回值為什麼是 test&、形參為什麼要加const、形參為什麼用引用?這些問題就不再過多陳述,有問題可參考:
c 賦值運算子的過載函式
首先我們來看object這個類,有以下幾個成員函式 class object object const object obj value obj.value 拷貝建構函式 object 析構函式 object operator const object obj 賦值運算子的過載函式 先來解釋一下運算...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
賦值運算子過載函式
問題 給出如下cmystring的宣告,要求為該型別新增賦值運算子函式。class cmystring 當面試官要求應聘者定義乙個複製運算子函式時,他會關注如下幾點 是否把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身 即 this 的引用?只有返回乙個引用,才可以允許連續賦值。否則如果...