在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况。
下面的两种情况发生,则我们需要将运算符重载为类的友元函数
<1>成员函数不能满足要求
<2>普通函数又不能访问类的私有成员时
举例说明:
class Complex{ double real, imag; public: Complex(double r, double i):real(r), imag(i){ }; Complex operator+(double r); }; Complex Complex::operator+(double r){ return Complex(real + r, imag); }
定义一个复数类,重载‘+‘运算符,经过重载之后
Complex c ; c = c + 5; //有定义,相当于 c = c.operator +(5);
但是如果出现5+c,则编译出问题。此时还需要重载普通函数。
Complex operator+ (double r, const Complex & c) { return Complex( c.real + r, c.imag); }
能解释 5+c,但是普通函数无法访问类的私有成员。
这时就需要重载为类的友元函数
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); };