題目:為給定的類新增賦值運算子函式。
分析:問題有以下幾個關鍵點:
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將是乙...