一·我們舉個必須要用過載運算子和過載運算子時必須要使用引用的例子
class myclass
~myclass(){
cout << "destrustor called"《輸出:
constructor called
constructor called
string1
string1
destrustor called
destrustor called
這裡我們過載了賦值運算子,將class1的str賦給了class2.str;
若我們不過載賦值運算子,用原來自帶的『=』,則會呼叫複製建構函式,將class1的str的值複製給class2的str,這是兩個str指向統一記憶體。在程式完成時,呼叫析構函式,先呼叫class2的析構函式,把str所指向的記憶體給清除,完成後再呼叫class1的析構函式,由於在class2時已經把str所指向的記憶體給清除了,這時會出現記憶體洩漏。
為什麼這裡的過載賦值運算子一定要用引用?
若引數不用引用,則有myclass &operator=(const myclass ele) {
這時實參傳值給形參會建立乙個臨時變數,呼叫複製建構函式將實參複製給形參,實參的str與形參的str指向同一塊記憶體。所以,當賦值函式完成時,會清除函式的所佔的記憶體,形參就會被清除,形參的str指向的記憶體也就會被清除。再呼叫class1.showchar()會發現記憶體洩漏。
輸出結果如下:
constructor called
constructor called
string1
destrustor called
destrustor called
若過載運算子函式的返回型別不用引用,則有則有myclass operator=(const myclass &ele) {
這是返回物件時會建立乙個臨時物件,再呼叫複製建構函式,將返回的物件複製給臨時物件,函式結束後,返回的物件被清除,返回物件的str所指向的記憶體也被清除,由於返回物件和臨時物件的 str指向同一塊記憶體,所以calss2=class1的str指向一塊隨機記憶體,在呼叫class2.showchar()時會隨機輸出。
輸出結果如下:
constructor called
constructor called
string1
destrustor called
destrustor called
此外:(class2=class1)=class3是不允許的,編譯器不允許臨時物件呼叫成員函式。
因此這種情況必須要用引用來傳遞引數和返回引數,使用引用返回的引數可以作為左值。
結構體用於map,set時要過載運算子
c sharp view plain copy include include using namespace std struct p intmain set iterator itr for itr s.begin itr s.end cin.eof itr if itr time 2 cout...
成員函式過載運算子和友元函式過載運算子的比較
1.對雙目 運算子而言,成員 函式過載 運算子的函式引數表中只有乙個引數,而用友元函式過載運算子函式引數表中含有兩個引數。對單木運算子來說,成員函式過載運算子的函式引數表中沒有引數,而用友元函式過載運算子函式引數表中含有乙個函式。這個問題要搞清楚,有乙個this 指標的問題。2.雙目運算子一般可以用...
成員函式過載運算子和友元函式過載運算子的比較
1.對雙目 運算子而言,成員 函式過載 運算子的函式引數表中只有乙個引數,而用友元函式過載運算子函式引數表中含有兩個引數。對單木運算子來說,成員函式過載運算子的函式引數表中沒有引數,而用友元函式過載運算子函式引數表中含有乙個函式。這個問題要搞清楚,有乙個this 指標的問題。2.雙目運算子一般可以用...