1. 程式人生 > >運算子過載函式作為類成員函式和友元函式

運算子過載函式作為類成員函式和友元函式

作為類成員函式的例子: #include <iostream> using namespace std; class Complex{ public: Complex(){real = 0; imag = 0;} Complex(double r, double i){real = r; imag = i;} Complex operator +(Complex& c2);//看似只有一個引數,實際上有兩個引數,由於過載函式是類的成員函式,有一個引數是隱含的,運算子函式 void display(); //是用this指標隱式地訪問類物件的成員。 private: double real; double imag; }; Complex Complex::operator+(Complex& c2){ return Complex(real+c2.real, imag+c2.imag); } void Complex::display(){ cout<<"("<<real; if (imag>0){cout<<"+";} cout<<imag<<"i)"<<endl; } int main(){ Complex c1(3,4), c2(5,-10), c3; c3 = c1 + c2;
cout<<"c1=";c1.display(); cout<<"c2=";c2.display(); cout<<"c3=";c3.display(); return 0; }作為類的友元函式的例子:
#include <iostream>
using namespace std;

class Complex{
public:
	Complex(){real = 0; imag = 0;}
	Complex(double r, double i){real = r; imag = i;}
	friend Complex operator +(Complex& c1, Complex& c2);
void display(); private: double real; double imag; }; Complex operator+(Complex& c1, Complex& c2){ return Complex(c1.real+c2.real, c1.imag+c2.imag); } void Complex::display(){ cout<<"("<<real; if (imag>0){cout<<"+";} cout<<imag<<"i)"<<endl; } int main(){ Complex c1(3,4), c2(5,-10), c3; c3 = c1 + c2;//將被解釋成:c3 = operator+(c1, c2);
cout<<"c1=";c1.display(); cout<<"c2=";c2.display(); cout<<"c3=";c3.display(); return 0; }
運算子過載函式有3種情況:普通函式、類的成員函式、類的友元函式1.在極少數的情況下才會使用普通函式,因為普通函式不能直接訪問類的私有成員。解決方法是在類中定義公用的設定資料的set函式和讀取資料的get函式,在過載函式中呼叫這些函式去訪問類的私有成員。顯然這樣不好。2.如果將運算子過載函式作為成員函式,它可以通過this指標自由地訪問本類的資料成員,因此可以少寫一個函式的引數。但必須要求運算表示式的第一個引數是一個類物件,而且與運算子函式型別相同。3.如果運算子左側的操本作數不是本類物件,則運算子過載函式不能作為成員函式,只能作為非成員函式;如果函式需要訪問類的私有成員,則必須宣告為該類的友元函式。4.將雙目運算子過載為友元函式是,在函式的形參列表必須有兩個引數,不能省略,形參的順序任意,不要求第一個引數必須為類物件。但在使用運算子的表示式中,要求運算子左側的運算元與函式的第一個引數對應,運算子右側的運算元與函式的第二個引數對應。數學上的交換律在此不適用。解決方法是再過載一次,交換引數順序。5.由於友元會破壞類的封裝,因此原則上,要儘量將運算子函式作為成員函式。但考慮到各方面的因素,一般將單目運算子過載為成員函式,將雙目運算子過載為友元函式。