面試題1 賦值運算子函式

2022-04-28 22:12:20 字數 705 閱讀 5925

題目:如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。

class

cmystring

;

考點:初級程式設計師解法:

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

上述**存在的問題:

先釋放記憶體,再分配新的記憶體,一旦新的記憶體分配失敗,則m_pdata將是乙個空指標,cmystring的例項不再保持有效狀態,違背了異常安全性原則。

解決方法1:先判斷記憶體是否分配成功,再釋放原有記憶體。

解決方法2:先建立乙個臨時例項,再交換臨時例項和原來的例項。

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

return *this

;11 }

分析:我們的目的是要釋放原來記憶體,開闢新的記憶體,同時遵守異常安全性原則。在上述**中,先建立乙個臨時變數strtemp,在此過程中會通過拷貝建構函式開闢新的記憶體,然後交換strtemp與m_pdata的指標。由於strtemp是臨時變數,作用域在if內,因此當程式執行到if的外面時就會呼叫該變數的析構函式釋放strtemp.m_pdata所指向的記憶體。同時,如果由於記憶體不足丟擲異常,也不會對原來例項的狀態產生影響,也就保證了異常安全性原則。

面試題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將是乙...