當 2 個對象相加時是沒有順序要求的,但要重載 + 讓其與一個數字相加則有順序要求,可以通過加一個友元函數使另一個順序的輸入合法。
class A
{
……
A operator+(const A & obj);
A operator+(const int b);
friend A operator+(const int b, A obj);
……
} ;
A a1(1);
A a2(2);
A a3,a4;
int m=1;
a3=a1+a2;//可以交換順序,相當月a3=a1.operator+(a2);
a3.display();
a4=a1+m;//因為加了個友元函數是以也可以交換順序了。
來自 <http://www.runoob.com/cplusplus/binary-operators-overloading.html>
總結:
C++允許對運算符進行重載,一般為operator op();當運算符函數為成員,則對象為第一操作數。
當運算符函數為友元函數時,則第一個形參為第一操作數
eg:
如果運算符左側的操作數屬于C++标準類型(如int)或是一個其他類的對象,則運算符重載函數不能作為成員函數,隻能作為非成員函數。如果函數需要通路類的私有成員,則必須聲明為友元函數。
<<運算符的重定義需要讓ostream對象成為第一個操作數,是以<<運算符函數的重載必須定義為友元函數
将雙目運算符重載為友元函數時,在函數的形參表列中必須有兩個參數,不能省略,形參的順序任意,不要求第一個參數必須為類對象。但在使用運算符的表達式中,要求運算符左側的操作數與函數第一個參數對應,運算符右側的操作數與函數的第二個參數對應。如:
c3=i+c2; //正确,類型比對
c3=c2+i; //錯誤,類型不比對
請注意,數學上的交換律在此不适用。如果希望适用交換律,則應再重載一次運算符“+”。如
Complex operator+(Complex &c, int &i) //此時第一個參數為類對象
{
return Complex(i+c.real, c.imag);
}
這樣,使用表達式i+c2和c2+i都合法,編譯系統會根據表達式的形式選擇調用與之比對的運算符重載函數。可以将以上兩個運算符重載函數都作為友元函數,也可以将一個運算符重載函數(運算符左側為對象名的) 作為成員函數,另一個(運算符左側不是對象名的)作為友元函數。但不可能将兩個都作為成員函數,原因是顯然的。
來自 <http://c.biancheng.net/cpp/biancheng/view/217.html>