題目:如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。
class
cmystring
注意事項:
把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用(*this),只有返回乙個引用,才可以允許連續賦值。
把傳入的引數的型別宣告為常量引用。如果傳入的引數不是引用而是例項,那麼從形參到實參會呼叫一次複製建構函式。在賦值運算子函式內不會改變傳入的例項的狀態,因此應該為傳入的引用引數加上const關鍵字。
是否釋放例項自身已有的記憶體。如果我們忘記在分配新記憶體之前釋放自身已有的空間,則程式將出現記憶體洩漏。
判斷傳入的引數和當前的例項(*this)是不是同乙個例項。如果是同乙個,則不進行賦值操作,直接返回。如果事先不判斷就進行賦值,當 *this和傳入的引數是同乙個例項時,一旦釋放了自身的記憶體,傳入的引數的記憶體也同時被釋放了,因此再也找不到需要賦值的內容了。
經典解法:
//返回值型別為該型別的引用,傳入引數宣告為常量引用
cmystring& cmystring::
operator=(
const cmystring &str)
考慮異常安全性的解法:
在前面的函式中,我們在分配記憶體之前先用delete釋放了例項m_pdata的記憶體。如果此時記憶體不足導致new char丟擲異常,則m_pdata將是乙個空指標,一旦在賦值運算子函式內部丟擲乙個異常,cmystring的例項不再保持有效的狀態。
先用new分配新內容,再用delete釋放已有的內容。這樣只在分配內容成功之後再釋放原來的內容,當記憶體分配失敗時我們能確保cmystring的例項不會被修改。
先建立乙個臨時例項,再交換臨時例項和原來的例項。
cmystring& cmystring::
operator=(
const cmystring &str)
return
*this
;}
面試題1 賦值運算子函式
面試題1 為如下cmysting的宣告,新增賦值運算子函式。class cmystring 注意事項 1.是否把返回值型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 2.是否把傳入的引數的型別宣告為常量引用。3.是否釋放例項自身的記憶體。4.是否判斷傳入的引數和當前的例項是不...
面試題1 賦值運算子函式
面試題1 為如下cmysting的宣告,新增賦值運算子函式。class cmystring 注意事項 1.是否把返回值型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 2.是否把傳入的引數的型別宣告為常量引用。3.是否釋放例項自身的記憶體。4.是否判斷傳入的引數和當前的例項是不...
面試題1 賦值運算子函式
題目 如下型別為cmystring的宣告,請為該型別新增賦值運算子函式。class cmystring 賦值運算子 函式 cmystring cmystring operator const cmystring str 當記憶體不夠時,new char會丟擲異常,分配記憶體失敗,m pdata將是乙...