賦值運算子函式嚴謹性的幾點思考

2021-08-19 16:42:06 字數 852 閱讀 7676

class cmystring

;

cmystring& cmystring::operator =(const cmystring& str)//返回型別為該型別的引用  //形參型別宣告為型別的常量引用

在3中,我們在分配記憶體之前先用delete釋放了例項m_pdata的記憶體。如果私事記憶體不足導致new char丟擲異常,m_pdata將是乙個空指標,這樣非常容易導致程式崩潰。也就是說,一旦在賦值運算子函式內部剖出乙個異常,cmystring的例項不在保持有效的狀態,這就違背了一場安全性(exception safety)原則。

要想在賦值運算子函式中實現異常安全性,有兩種方法。乙個簡單的方法是我們先用new分配新內容在用delete釋放已有的內容。這樣只有在分配記憶體成功之後才會釋放原來的內容,也就是就是記憶體可能會分配失敗,但我們也能確保cmystring例項不被修改。其實,在這裡我更建議先建立乙個臨時例項,在交換臨時例項和原來的例項。

**如下:

cmystring& cmystring::operator = (const cmystring &str)

return *this;

}

在這個函式中,我們先建立了乙個臨時例項strtemp,接著把strtemp.m_pdata和例項自身的m_pdata作交換。由於strtemp是乙個區域性變數,當程式執行到if之外的時候,就會自動呼叫strtemp的析構函式,把strtemp.m_pdata指向的記憶體釋放掉。由於strtemp.m_pdata指向的記憶體就是例項之前的m_pdata的記憶體,相當於自動呼叫析構函式釋放例項的記憶體。

賦值運算子函式

賦值運算子函式的 需要關注幾點 1 是否把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 只有返回乙個引用,才可以允許連續賦值。否則如果函式的返回值void,該賦值運算子將不能做連續賦值。2 是否把傳入的引數的型別宣告為常量引用。引數宣告為引用可以避免無謂的消耗,提高...

賦值運算子函式

題目 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。class cmystring 1 經典解法,初級程式設計師 cmystring cmystring operator const cmystring str 2 考慮異常安全的解法,高階程式設計師 cmystring cmys...

賦值運算子函式

型別宣告如下 class cmystring 請為上型別新增賦值運算子函式.經典解法 cmystring cmystring operator const cmystring str 考慮異常安全性解法 cmystring cmystring operator const cmystring str...