題目:cmystring型別宣告如下,請為其新增「賦值運算子」函式。
class cmystring;
對於此類問題,面試官通常關注以下幾點:
1. 返回值型別是否為引用,函式結束時是否「return *this;」。只有這樣,才能允許cmystring型別物件的連續賦值。
2. 引數型別是否為常量引用。如果傳入引數非引用而是例項,則從形參到實參會呼叫一次拷貝建構函式,造成效能損耗。賦值運算子函式內不會改變引數狀態,因此應該為引用引數加上const關鍵字。
3. 是否釋放m_pdata之前所指向記憶體,否則將造成記憶體洩露。
4. 是否判斷「傳入引數與*this是否相等」,如果相等則直接返回。如果不作判斷,且*this和傳入引數是同一例項,那麼一旦釋放自身記憶體,則傳入引數的記憶體也同時被釋放,就再也找不到需要賦值的字串內容了。
完整考慮上述4點,可寫出如下**:
cmystring& cmystring::operator = (const cmystring& str)
上面函式中,先delete釋放已有內容,這樣做其實還存在隱患。如果在new時丟擲異常,cmystring的例項將不再保持有效狀態,違背了異常安全(exception safety)原則。可以修改如下:
cmystring& cmystring::operator = (const cmystring& str)
還有一種實現方式如下:
cmystring& cmystring::operator =(const cmystring & str)return *this;
}
先建立乙個臨時例項strtemp,然後把strtemp.m_pdata與例項自身m_pdata交換。strtemp是if語句內的區域性變數,會自動呼叫析構函式銷毀,strtemp.m_pdata所指向的記憶體就是例項之前m_pdata的記憶體。在執行建立臨時變數strtemp的建構函式時,如果new操作丟擲異常,這時還沒有修改例項狀態,因此例項狀態還是有效的,也就保證了異常安全。
【學習資料】 《劍指offer 名企面試官精講典型面試題》
面試題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將是乙...