天天看點

C++——操作符重載

操作符重載

雙目操作符

計算類的雙目操作符('+'和'-')

代碼示例

指派類的雙目操作符(+=、-=)

單目操作符

計算類單目操作符(-(取負)、~(取反))

自增減單目操作符(++、--)

插入(輸出)和提取(輸入)操作符('<<' 和 '>>')

下标操作符('[]')

函數操作符('()')

new/delete 操作數

操作符重載的限制

表達式的結果是右值。

左右操作數既可以是左值也可以是右值。

兩種實作方式:

成員函數形式(左調右參)

L#R的表達式可以被編譯器處理成 L.operator#®的成員函數調用形式,該函數的傳回值就是表達式的結果。

全局函數形式(左右操作數都作為參數)

L#R的表達式也可以被成立成::operator#(L,R)的全局函數調用形式,該函數的傳回值就是表達式的結果。

注:使用friend關鍵字,可以把一個全局函數聲明為某個類的友元,友元函數可以通路類中的任何成員。

complex.cpp

執行結果

C++——操作符重載

表達式結果是左值,就是左操作數的自身。

左操作數一定是左值,右操作數可以是左值也可以是右值。

成員函數形式

L#R ⇒ L.operator#®

全局函數形式

L#R ⇒ ::operator#(L,R)

C++——操作符重載

表達式結果是右值,不能對表達式進行指派操作

操作數隻有一個,可以左值也可以右值

兩種實作形式

#O ⇒ O.operator#();

#O ⇒ ::operator#(O);

integer.cpp

C++——操作符重載

前++、–

表達式的結果是左值,就是操作數自身

操作數一定是左值

後++、–

表達式的結果是右值,是操作數自增減前的副本

操作數也一定是左值

O# ⇒ O.operator#(int);

O# ⇒ ::operator#(O,int);

注:字尾自增減操作符函數中增加了一個int啞元參數,用于和字首自增減進行區分。

C++——操作符重載

功能:實作自定義類型直接的輸入和輸出

注:隻能使用全局函數形式(friend)

io_operator.cpp

C++——操作符重載

功能:讓一個對象可以像數組一樣去使用。

注:非常對象傳回左值,常對象傳回右值。

array_operator.cpp

C++——操作符重載

功能:讓對象像函數一樣去使用

注:對參數個數、類型和傳回值類型沒有限制。

func_operator.cpp

C++——操作符重載

new.cpp

C++——操作符重載

不是所有的操作符都能重載,以下操作符不能重載:

作用域限定操作符(::)

直接成員通路操作符(.)

直接成員指針解引用操作符(.*)

條件操作符(?:)

位元組長度操作符(sizeof)

類型資訊操作符(typeid)

如果一個操作符所有操作數都是基本類型,則該操作符無法重載。

操作符重載不會改變編譯器預定義的優先級

操作符重載無法改變操作數的個數

無法通過操作符重載發明新的符号

隻能使用成員形式不能使用全局形式的操作符(= 、()、->)