先上題:下列運算符都可以被友元函數重載的是:
A)=,+,-,\
B)[],+,(),new
C)->,+,*,>>
D)<<,>>,+,*
正確答案為D
我們知道,在運算符重載,友元函數運算符重載函數與成員運算符重載函數的區別是:友元函數沒有this指針,而成員函數有,因此,在兩個操作數的重載中友元函數有兩個參數,而成員函數只有一個。
因此,我們可以總結如下:
1.對雙目運算符而言,成員函數重載運算符的函數參數表中只有一個參數,而用友元函數重載運算符函數參數表中含有兩個參數。
對單木運算符來說,成員函數重載運算符的函數參數表中沒有參數,而用友元函數重載運算符函數參數表中含有一個函數。這個問題要搞清楚,有一個this指針的問題。。。
2.雙目運算符一般可以用友元函數重載和成員函數重載,但有一種情況只可以用友元函數重載。
即:雙目運算符左邊的變量是一個常量,而不是對象!!!這點很重要的額。
而關於運算符的重載,有以下經驗可以記著:
1.對於單目運算符,建議選擇成員函數;
2.對於運算符“=,(),[],->”只能作為成員函數;
3.對於運算符“+ =,-=,/=,*=,&=,!=,~=,%=,<<=,>>=”建議重載為成員函數;
4.對於其他運算符,建議重載為友元函數。
那麼下面這個題的答案也就很明顯了:
將x+y*z中的“+”用成員函數重載,“*”用友元函數重載應該寫為:?
答案為:x.operator+(operator*(y,z))