賦值運算子過載函式

2021-05-26 11:43:47 字數 1472 閱讀 2194

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

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

過載賦值運算子

1 注意過載賦值運算子和,運算子必須定義為類的成員函式。2 注意 如果程式不提供顯示的賦值運算子則系統會提供乙個預設的賦值運算子。3 什麼時候過載賦值運算子 當類中含有指標成員時,一般都要重定義類的賦值運算子。4 過載賦值運算子時應有處理語句m m的情況。其中m是某乙個類的物件。如果不處理這樣的語句...

賦值運算子過載

在下面類中實現 class cmystring 為了寫出乙個完整的賦值運算子過載函式,我們要考慮以下幾個問題 一步步解決上述的問題,我們可以編寫出經典的演算法 cmystring cmystring operator const cmystring str return this 考慮到異常安全性的...