劍指Offer 面試題1(賦值運算子函式)

2021-09-25 18:26:35 字數 1530 閱讀 8789

生活有種律動,須有光有影,有左右有,有晴有雨,滋味就含在這變而不猛的曲折裡.–老舍

題目描述

如下為型別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 基本語法的理解,如運算子過載 常量引用等。考查對記憶體洩漏的理解 對於...