c 操作符過載的兩種型別

2021-08-04 07:28:04 字數 1607 閱讀 7937

運算子過載是c++多型的重要實現手段之一。通過運算子過載對運算子功能進行特殊定製,使其支援特定型別物件的運算,執行特定的功能,增強c++的擴充套件功能。

運算子過載的我們需要堅持四項基本原則:

(1)不可臆造運算子;

(2)運算子原有運算元的個數、優先順序和結合性不能改變;

(3)運算元中至少乙個是自定義型別;

(4)保持過載運算子的自然含義。

一般來說,c++運算子過載可採用成員函式和友元函式,二者都可以訪問類的私有成員,那麼該採用哪一種呢?首先看一下二者的區別。

(1)當過載為成員函式時,會隱含乙個this指標;當過載為友元函式時,不存在隱含的this指標,需要在引數列表中顯示地新增運算元。

(2)當過載為成員函式時,只允許右引數的隱式轉換;當過載為友元函式時,能夠接受左引數和右引數的隱式轉換。

如下**:

class

cstring

;

因為cstring的構造函式引數為乙個char*,所以如果採用友元形式的operator +(const cstring&, const cstring&),那麼char+cstring和cstring+char都能正常工作;而如果採用成員函式形式cstring::operator+(const cstring& rhs),則只能接受cstring+char,如果執行char+cstring則會編譯出錯。我們往往習慣cstring+char和char+cstring都應該被接受。需要注意的是,隱式轉換由於臨時變數的增加往往效率不高。如果應用程式對效率要求較高,針對以上類,建議選擇定義多個運算子的友元過載版本:

cstring& operator

+(const

cstring&, const

cstring&);

cstring& operator

+(const

char

*, const

cstring&);

cstring& operator

+(const

cstring&, const

char

*);

一般而言,對於雙目運算子,最好將其過載為友元函式;而對於單目運算子,則最好過載為成員函式。

但是也存在例外情況。有些雙目運算子是不能過載為友元函式的,比如賦值運算子=、函式呼叫運算子()、下標運算子、指標運算子->等,因為這些運算子在語義上與this都有太多的關聯。比如=表示「將自身賦值為…」,表示「自己的第幾個元素」,如果將其過載為友元函式,則會出現語義上的不一致。

還有乙個需要特別說明的就是輸出運算子<<。因為《的第乙個運算元一定是ostream型別,所以《只能過載為友元函式,如下:

friend

ostream& operator

<<(ostream& os, const

complex& c);

ostream& operator

<<(ostream& os, const

complex& c)

[1]李健.編寫高質量**:改善c++程式的150個建議.第一版.北京:機械工業出版社,2012.1:131-134

C 過載型別轉換操作符

在需要做資料型別轉換時,一般顯式的寫法是 cpp view plain copy font size 18px type1 i type2 d i type1 d 顯式的寫型別轉,把d從type2型別轉為type1型別 這種寫法不能做到無縫轉換,也就是直接寫 i d,而不需要顯式的寫 type1 來...

C 操作符過載

1.作為成員過載 class myclass public myclass operator const myclass d cons friend myclass operator const myclass a1,const myclass a2 關於返回值型別的討論 呼叫者堆疊裡返回乙個物件效...

C 過載操作符

過載操作符 一 過載操作符的定義 1.過載操作符的結構 返回型別 operator 需要過載的操作符 形參列表 注意 形引數目應和運算元數目相同。2.過載操作符的幾條注意事項 1 過載的操作符名不能通過連線其他合法符號來建立任何新的操作符。如 2 過載操作符必須具備至少乙個類型別或列舉型別的運算元。...