操作符重載可以用兩種方式重載
一、用頂層函數進行操作符重載
二、用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);
}