天天看點

C++——友元函數重載運算符時形參的順序

當 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>