生活有種律動,須有光有影,有左右有,有晴有雨,滋味就含在這變而不猛的曲折裡.–老舍題目描述
如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。
class
cmystring
;
題目解析
對於定義乙個賦值運算子函式時,需要考慮
1.是否把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用
(*this).只有返回乙個引用,才可以連續賦值;否則,如果函式的返回值為void,則應用該賦
值運算子將不能進行連續賦值.假設有3個cmystring的物件:str1,str2,str3,在程式中語
句str1=str2=str3將不能通過編譯.
2.是否把傳入的引數的型別宣告為常量引用.如果傳入的引數不是引用而是例項,那麼從
形參到實參會呼叫一次複製建構函式.把引數宣告為引用可以避免這樣的無謂消耗,能提
高**的效率,同時,我們在賦值運算子函式內不會改變傳入的例項的狀態,因此應該為
傳入的引用引數加上const關鍵字.
3.是否釋放例項自身已有的記憶體,如果我們忘記在分配新記憶體之前釋放自身已有的空間,
則程式將出現記憶體洩漏.
4.判斷傳入的引數和當前的例項(*this)是不是同乙個例項,如果是同乙個,則不進行賦值
操作,直接返回.如果事先不判斷就進行賦值,那麼在釋放例項自身記憶體的時候就會導致
嚴重的問題:當*this和傳入的引數是同乙個例項時,一旦釋放了自身的記憶體,傳入的引數
的記憶體也同時被釋放了,因此再也找不到需要賦值的內容了.
本題考點
示例**
// 題目:如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。
#include
#include
class
cmystring
;cmystring::
cmystring
(char
*pdata)
else
}cmystring::
cmystring
(const cmystring &str)
cmystring::
~cmystring()
cmystring& cmystring::
operator=(
const cmystring& str)
// ********************測試**********************
void cmystring::
print()
void
test1()
// 賦值給自己
void
test2()
// 連續賦值
void
test3()
intmain
(int argc,
char
* ar**)
劍指offer 面試題1 賦值運算子函式
題目 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。class cmystring 當面試官要求應聘者定義乙個賦值運算子函式時,他對 會關注以下幾點 是否把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 只有返回乙個引用,才可以允許連續賦值。否則如...
劍指offer 面試題1 賦值運算子函式
題目要求為下面乙個類實現乙個賦值運算子的函式 class cmystring 我們要實現任意的乙個類的賦值運算子函式,都要注意一些方面 書上的解法給的確實很完備,而且後來用了一種巧妙的方法讓程式自動釋放記憶體。但我覺得重點是他提到的異常安全性的處理,這裡的話如果我們在new的時候記憶體不夠,而我們又...
《劍指Offer》面試題1 賦值運算子函式
要求 如下型別為cmystring的宣告,請為型別新增賦值運算子函式。class cmystring 測試用例 把乙個cmystring的例項賦值給另外乙個例項 把乙個cmystring的例項賦值給自己 連續賦值 本題考點 對c 基本語法的理解,如運算子過載 常量引用等。考查對記憶體洩漏的理解 對於...