一般情況下,將運算子過載為類的成員函數是較好的選擇。但有時,過載為成員函數不能滿足使用要求,過載為全域性函數又不能存取類的私有成員,因此需要將運算子過載為友元。
例如,對於複數類 Complex 的物件,希望它能夠和整型以及實數型資料做四則運算,假設 c 是 Complex 物件,希望
c+5
和
5+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);
}