C++運算子過載為友元函數

2020-07-16 10:04:21
一般情況下,將運算子過載為類的成員函數是較好的選擇。但有時,過載為成員函數不能滿足使用要求,過載為全域性函數又不能存取類的私有成員,因此需要將運算子過載為友元。

例如,對於複數類 Complex 的物件,希望它能夠和整型以及實數型資料做四則運算,假設 c 是 Complex 物件,希望c+55+c這兩個表示式都能解釋得通。

將+過載為 Complex 類的成員函數能解釋c+5,但是無法解釋5+c。要讓5+c有意義,則應對+進行再次過載,將其過載為一個全域性函數。為了使該全域性函數能存取 Complex 物件的私有成員,就應該將其宣告為 Complex 類的友元。具體寫法如下:
class Complex
{
    double real, imag;
public:
    Complex(double r, double i):real(r), imag(i){};
    Complex operator + (double r);
    friend Complex operator + (double r, const Complex & c);
};
Complex Complex::operator + (double r)
{  //能解釋c+5
    return Complex(real+r, imag);
}
Complex operator + (double r, const Complex & c)
{  //能解釋5+c
    return Complex (c.real+r, c.imag);
}