在這個例子中,我們把運算符函數由成員函數的性質變成類Complex的友元函數。由於友員函數不是類的成員之一,故沒有隱含的參數this。所以友元運算符函數operator+()和operator-()的參數表中必須帶兩個顯式參數。
本例的main()函數與例10.2看起來一樣,但是,當編譯器分析表達式cl+c2和cl-c2時,自動把它解釋成operator+(cl,c2)和operator-(cl,c2),從而調用相應的友元運算符函數。
回想一下例10.1中的友函數add(Cl,C2),與此處的operator+(cl,c2)的區別在於函數名不同,一個為add,一個為0peratOT+,但它們具有一樣的功能。
10.3重載雙目運算符
雙目運算符又叫二元運算符,是指具有兩個操作數的運算符。因此,重載雙目運算符時,運算符函數應該具有兩個參數。
一、使用成員運算符函數
通過類的成員運算符函數重載雙月運算符時成員運算符函數。
其中,op代表一個雙目運算符,operator是C++中的關鍵字,用以表運算符函數。
友元運算符函數的參數表中隻能有一個參數,它和隱含參數this廣起用作雙目運算符的兩個操作數。
當編譯器分析表達式oblopob2時,就會自動把它解釋為obl.operatorop(ob2)其中,oblob2為類的對象。注意,編譯器把運算符左邊的對象用做活動對象,把運算符右邊的對象用做實際參數。
在例10.4中,類String中的數據成員buffer用來存儲字符串,leath記錄字符串的長度。設計了三個構造函數:缺省構造函數,帶一個字符串參數的構造函數和拷貝構造函數。還有兩個運算符函數operator+()和operator=()。
下麵我們來分析程序的運行過程。當程序運行到語句x=strl+str2;時,首先處理表達式strl+str2由於類String中定義了運算符函數operator+(),所以編譯器把該表達式解釋為:strl.operator+(str2)從而以strl為活動對象,str2為顯式參數來調用運算符函數operator+()。
該函數首先創建對象細郵,然後通過VC++中的字符串函數實現字符串的連接,最後,該函數返回連接後的字符串returntemp;
該語句首先撤消對象temp(temp為局部變量),由於返回值是一個String類對象,所以編譯器執行拷貝構造函數String(constString),並自動創建一個String類的臨時對象,用以儲存字符串連接的結果。
當把字符串連接的結果賦值給對象x後,編譯器將撤消拷貝構造函數所創建的臨時對象。
下麵我們以main()函數中的表達式y=x為例,來說明運算符函數operator-()的執行過程。
如果是同一個對象,則直接返回對象y的引用。否則,使用Visual C++中的字符串函數完成字符串的賦值,賦值結果保存在this中。最後,返回賦值結果。
注意,運算符函數0pemt0r=()返回類型是對類String對象的引甩,因此可以使用運算符=進行連續賦值,例如:
x=y=strl+str2;
二、使用友元運算符函數
通過類的友元運算符函數重載雙目運算符時,友元運算符函數的函數類型。
其中,op代表一個雙目運算符,(istor是C++中的關鍵字,用似表示一個運算符函數。
友元運算符函數的參數表中必須有兩個參數,用作運算符的操作數。之所以需要兩個參數,是因為友員運算符函數不是類的成員,所以沒有隱含參數this時,就會自動把它解釋為:operatorop(obi,ob2)
其中,obi、ob2為類的對象。注意,編譯器把運算符左邊的對象用作第一個參數,把運算符右邊的對象用作第二個參數。
請讀者把上例中成員運算符函數改為友員運算符函數。注意,賦值運算符=隻能重載為成員運算符函數,不能是友員運算符函數。
10.4重載單目運算符
單目運算符又叫一元運算符,是指具有一個參數的運算符。因此,重載單目運算符時,運算符函數應該帶有一個參數。
一、使用成員運算符函數
通過類的成員運算符函數重載單目運算符時,成員運算符函數的函數原型的一般形式為:返回類型operatorop()。
其中,op代表一個單目運算符,operetor是Visual C++中的關鍵字,用以表示一個運算符函數。
由於成員函數帶有一個隱含參數this,所以通過成員運算符函數重載單目運算符時,參數表中不能帶有任何參數。
在類Complex中,我們同時重載了雙目運算符-和目運算符-,其中一個用來表示複數相減,一個用做對複數取負。由於負號、減號運算符函數的參數個數不同,因此編譯器能夠區分它們。首先執行構造函數Comple*(double,double),建一個臨時對象,然後返回這個臨時對象。調用構造函數時,使用的實際參數-real和-imag即為活動對象cl的實部和虛部的負數。
二、使用友元運算符函數
通過類的友元運算符函數重載單目運算符時,友元運算符函數的函數原型的一般形式為:friend返回類型operatorop(參數表)。
友元運算符函數的參數表中必須有一個參數,用作單目運算符的操作數。之所以需要一個參數,是因為友員運算符函數不是類的成員,所以沒有隱含參數this。