面試題1 賦值運算子函式深度剖析

2021-06-22 02:18:37 字數 2253 閱讀 5471

題目:為給定的類新增賦值運算子函式。

分析:問題有以下幾個關鍵點:

1.給定的引數是const 引用型別。const是為了避免修改,引用是為了避免呼叫拷貝構造。

2.在賦值過程中避免自身給自身賦值。

3.避免在賦值過程中出現記憶體洩露。

4.返回值的型別是引用,否則無法連續賦值。這個要求在本書中或是其他書籍中都是這麼被要求的,本篇主要是分析下,除了引用之外,返回其他的型別能否實現「標準要求」 所達到的效果。

上面的這份實現中:

1. cmystring&,返回了引用型別。

2. if( this != &str ),保證了不會出現自身為自身賦值的情況。

3.cmystring strtemp( str ),定義了乙個區域性變數,使得在離開其作用域後,會自動呼叫其析構,避免了記憶體洩露,接著進行了swap 操作。

4. return *this。

下面我們看看具體的過程:

結果:

step1-step3:呼叫各自的構造。

step4:str2呼叫operator=,實參為str3。

step5:在operator=實現中,cmystring strtemp(str)定義了臨時區域性物件 ,呼叫了拷貝建構函式(複製構造),即又生成str3的副本strtemp--002ef614。

step6:從operator= 中返回,離開strtemp的作用域,所以要呼叫其析構。

step7:str1呼叫operator=,

step8:同5,我們發現,這裡生成的臨時物件跟5中生成的臨時物件是一樣的,都是

002ef614。

step9:同6

step10-step12:呼叫str1,str2,str3的析構函式。

那麼我們再來看下operator= 的返回值為物件而非引用的情況:

結果:

step1-step5: 與引用型別的分析一致

step6:這裡又出現了一次拷貝構造,這個構造是來自**,我們且往下看。

step7:進行了析構,是析構了step5中構造的物件002bf5d8,所以我們確認,這個物件是swap時的區域性臨時物件。這個時候我們還是不太確定step6裡構造的物件是什麼。

step8:此時str1開始呼叫它的operator=了,開了上一次的呼叫函式已經結束了,那麼step6中的物件002bf630肯定就是在函式返回時,返回的*this的乙份拷貝,因為這裡的返回值型別為value型別,而非引用型別,所以就必須的再生成乙個副本返回,原來如此。

step9:是區域性臨時物件,同上。

step10:也是*this的副本,作為返回值。

step11:區域性臨時物件的析構。

step12 - step13:呼叫 *this 的兩個副本的析構函式。

step14- step16:呼叫str1, str2,str3 的析構。

經過上面的兩種情況的分析,我們總結出,在operator= 的定義中, 返回值型別定義為引用, 與引數型別的引用出發點是一致的,就是引用不會生成副本,不用呼叫物件的拷貝構造(對於物件引數),而並不是為了保證連續的賦值,我們已經從例項的結果看到,返回物件型別也是能達到目的的,只不過這樣做需要額外的拷貝構造來生成物件的副本而已。

附:完整測試**

#include using namespace std;

int step = 1;

class cmystring;

cmystring(const cmystring& str);

~cmystring();

//return reference

//const parameter

cmystring& operator=(const cmystring& str)

}private:

char *m_pdata;

};void test()

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