一、用顶层函数进行操作符重载
二、用friend函数进行操作符重载
三、使用成员函数进行操作符重载(在上一篇文章讲过讲过)
1、一个以顶层函数形式被重载的操作符必须在它的参数表中包含一个类的对象
通常,如果使用成员函数重载二元操作符时,只需要一个参数。而用顶层函数时需要两个参数,这两个参数对应着二元操作符的两个操作数。下标操作符[],赋值操作符=,函数调用操作符(),指针操作符->必须以类的成员函数的形式重载;
class Complex { public: Complex(); Complex(double ); Complex(double ,double); void write() const; double get_real() const { return real; } double get_imag() const { return imag; } private: double real; double imag; };
类的声明与用成员函数重载操作符有所不同,用成员函数重载函数时需要在类里面进行声明;
Complex operator+(const Complex&) const;顶层函数在调用操作符函数:
Complex operator+(const Complex& t, const Complex& u) { return Complex(t.get_real + u.get_real, t.get_imag + u.get_imag); } 2、类的私有成员只能被该类的成员函数和该类的friend函数访问,类的保护成员只能被该类的或其派生的成员函数和该类的frieng函数访问。
class C { //... friend int f(); //... } 该声明的作用是赋予f访问C的私有和保护成员的权利,因为f不是成员函数;
class Complex { public: Complex(); Complex(double ); Complex(double ,double); void write() const; friend Complex operator+(const Complex&, const Complex&); friend Complex operator-(const Complex&, const Complex&); friend Complex operator*(const Complex&, const Complex&); private: double real; double imag; }; Complex operator+(const Complex& t, const Complex& u) { return Complex(t.real + u.real, t.imag+ u.imag); }