【C++學習筆記】運算子過載(二)
阿新 • • 發佈:2018-12-23
我們回顧一下運算子過載的特點:
- 運算子過載函式名必須為:operator<運算子>。
- 運算子的過載是通過運算子過載函式來實現的。對於二元運算子過載函式,函式的引數通常為一個即右運算元,運算子的左運算元為呼叫過載函式時的物件。對於一元運算子過載函式,運算子的左運算元或右運算元為呼叫函式的物件。
- 運算子過載函式的返回型別:若物件進行運算後的結果型別仍為元型別,則運算子過載函式的返回型別為原型別。
引數和返回值
接下來我們要仔細講講運算子過載的引數和返回值問題。
- 對於某些運算子(比如+、-)來說,我們往往只需要實現其運算功能,而不希望改變運算的引數。對於任何函式引數,如果僅需要從引數中讀而不改變它,預設地應當按const引用來傳遞它。普通算術運算子和布林運算子不會改變引數,所以以const引用傳遞是使用的主要方式。當函式是一個類成員的時候,就轉換為const成員函式普通算術運算子和布林運算子不會改變引數,所以
- 應該選擇的返回值取決於運算子所期望的型別。如果運算子的效果是產生一個新值,將需要產生一個作為返回值的新物件。(這句其實有一點廢話)
- 所有賦值運算子改變左值。為了使得賦值結果可以用於鏈式表示式(像A=B=C),應該返回剛剛改變了的左值的引用。這裡返回值應該是一個nonconst引用。——因為這樣方便進一步計算。
關於成員函式和友元函式的選擇
下面這些原則可以幫我們確定是定義為成員函式還是友元函式:
- 賦值(=)、下標([])、呼叫(())和成員函式訪問的箭頭(->)等操作函式必須定義為成員函式
- 像賦值一樣,符合賦值操作通常應定義為成員函式。但是定義成非成員函式一般也不會出錯。
- 改變物件狀態或與給定的型別緊密聯絡的其他操作符,如自增、自減等通常定義為成員函式(因為其設計對自身成員的操作)
- 對稱的操作符,如算術運算子,相等操作符、關係操作符和位操作符,最好定義為非成員函式
例子:
#include<iostream> using namespace std; class Complex { private: float real images; public: Complex(float r = 0,float i = 0); friend Complex operator+(const Complex&,const Complex&); friend Complex operator-(const Complex&,const Complex &); Complex operator++();//定義前置運算子,括號裡沒有形參 Complex operator++(int);//定義後置運算子,引數表中有int。 friend Complex operator ++(Complex&);//定義友元時,要加上友元的引用 friend Complex operator++(Complex&,int);