C C 面試題集合 4

2021-07-02 16:50:56 字數 1977 閱讀 3063

問題:給出如下cmystring

的宣告,要求為該型別新增賦值運算子函式。

class

cmystring;

當面試官要求應聘者定義乙個複製運算子函式時,他會關注如下幾點: ·

是否把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身(即

*this

)的引用?只有返回乙個引用,才可以允許連續賦值。否則如果函式的返回值是

void

,假設有三個

cmystring

的物件,

str1

、str2

和str3

,在程式中語句

str1=str2=str3

將不能通過編譯。 ·

是否把傳入的引數的型別宣告為常量引用?如果傳入的引數不是引用而是例項,那麼從形參到實參會呼叫一次構造拷貝函式。把引數申明為引用可以避免這樣的無謂消耗,能提高**的效率。同時,我們在賦值運算子函式內是不會改變傳入的例項的狀態的,因此應該為傳入的引用引數加上

const

關鍵字。 ·

是否記得釋放例項自身已有的記憶體?如果忘了在分配新記憶體之前釋放自身已有的空間,將出現記憶體洩露。 ·

是否判斷傳入的引數是不是和當前的例項(

*this

)是不是同乙個例項?如果是同乙個,則不進行賦值操作,直接返回。如果事先不判斷,就進行賦值,那麼在釋放例項自身的記憶體的時候就會導致嚴重的問題:當

*this

和傳入的引數是同乙個例項時,那麼一旦釋放了自身的記憶體,傳入的引數的記憶體也同時被釋放了,因此再也找不到需要賦值的內容了。

當我們完整地考慮了上述幾方面之後,我們可以寫出如下的**:

cmystring& cmystring::

operator

=(const

cmystring &str)

這是一般

c++教材上提供的參考**。如果是面試的是應屆畢業生或者

c++初級程式設計師,如果能全面地考慮到前面四點並完整地寫出**,面試官可能會讓他通過這輪面試。但如果面試的是

c++的高階程式設計師,面試官可能會提出更高的要求。

面試官會提醒我們在前面的函式中,顯示地用

delete

釋放自身

m_pdata

的記憶體。同時我們也會在析構函式中用

delete

釋放自身

m_pdata

的記憶體。如果這個型別中新增新的指標成員變數,那麼我們至少需要做兩處修改,即同時在析構函式和這個賦值運算子函式裡新增一條

delete

語句來釋放新指標所指向的記憶體。乙個改動需要在**中多個地方修改**,通常是有安全隱患的。通常我們會記得在析構函式裡用

delete

釋放指標成員變數,但未必每次都記得到賦值運算子函式來新增**釋放記憶體。

更好的辦法在複製運算子函式中利用析構函式自動釋放例項已有的記憶體。下面是這種思路的參考**:

cmystring& cmystring::

operator

=(const

cmystring &str)

return

*this;}

在這個函式中,我們定義乙個臨時例項

strtemp

,並把strtemp

的m_pdata

指向當前例項(

*this

)的m_pdata

。由於strtemp

是個區域性變數,但程式設計師執行到

if的外面是也就出了的該變數的域,就會自動呼叫

strtemp

的析構函式,就會把

strtemp.m_pdata

所指向的記憶體釋放掉。由於

strtemp.m_pdata

指向的記憶體就是當前例項之前

m_pdata

的記憶體。這就相當於自動呼叫析構函式釋放當前例項的記憶體。如果新增加指標成員變數,我們只需要在析構函式裡正確地釋放,而不需要對賦值運算子函式做任何修改。

C C 面試題集合 2

本面試題均轉換何海濤部落格 題目 求1 2 n,要求不能使用乘除法 for while if else switch case等關鍵字以及條件判斷語句 a?b c 分析 這道題沒有多少實際意義,因為在軟體開發中不會有這麼 的限制。但這道題卻能有效地考查發散思維能力,而發散思維能力能反映出對程式設計相...

集合面試題

list,set集合與collection有直接的關係而map屬於間接的關係 list的特點 可以儲存重複的資料,有順序 set的特點 不能儲存重複的資料,沒有順序 map的特點 根據鍵值對保持資料,鍵不可以重複,值可以重複沒有順序 arraylist 優點 查詢速度較快,使用新增和刪除功能較慢 l...

面試題 集合

set 無序 儲存單列資料的集合,儲存的資料是無順序的,並且不允許重複,最常用的是hashset list 有序 儲存單列資料的集合,儲存的資料是有順序的,並且值允許重複,最常用的是arraylist map 儲存鍵值對這樣的雙列資料集合,儲存的資料是無序的,它的鍵是不允許重複的,但是值是允許重複的...