操作符重載
雙目操作符
計算類的雙目操作符('+'和'-')
代碼示例
指派類的雙目操作符(+=、-=)
單目操作符
計算類單目操作符(-(取負)、~(取反))
自增減單目操作符(++、--)
插入(輸出)和提取(輸入)操作符('<<' 和 '>>')
下标操作符('[]')
函數操作符('()')
new/delete 操作數
操作符重載的限制
表達式的結果是右值。
左右操作數既可以是左值也可以是右值。
兩種實作方式:
成員函數形式(左調右參)
L#R的表達式可以被編譯器處理成 L.operator#®的成員函數調用形式,該函數的傳回值就是表達式的結果。
全局函數形式(左右操作數都作為參數)
L#R的表達式也可以被成立成::operator#(L,R)的全局函數調用形式,該函數的傳回值就是表達式的結果。
注:使用friend關鍵字,可以把一個全局函數聲明為某個類的友元,友元函數可以通路類中的任何成員。
complex.cpp
執行結果

表達式結果是左值,就是左操作數的自身。
左操作數一定是左值,右操作數可以是左值也可以是右值。
成員函數形式
L#R ⇒ L.operator#®
全局函數形式
L#R ⇒ ::operator#(L,R)
表達式結果是右值,不能對表達式進行指派操作
操作數隻有一個,可以左值也可以右值
兩種實作形式
#O ⇒ O.operator#();
#O ⇒ ::operator#(O);
integer.cpp
前++、–
表達式的結果是左值,就是操作數自身
操作數一定是左值
後++、–
表達式的結果是右值,是操作數自增減前的副本
操作數也一定是左值
O# ⇒ O.operator#(int);
O# ⇒ ::operator#(O,int);
注:字尾自增減操作符函數中增加了一個int啞元參數,用于和字首自增減進行區分。
功能:實作自定義類型直接的輸入和輸出
注:隻能使用全局函數形式(friend)
io_operator.cpp
功能:讓一個對象可以像數組一樣去使用。
注:非常對象傳回左值,常對象傳回右值。
array_operator.cpp
功能:讓對象像函數一樣去使用
注:對參數個數、類型和傳回值類型沒有限制。
func_operator.cpp
new.cpp
不是所有的操作符都能重載,以下操作符不能重載:
作用域限定操作符(::)
直接成員通路操作符(.)
直接成員指針解引用操作符(.*)
條件操作符(?:)
位元組長度操作符(sizeof)
類型資訊操作符(typeid)
如果一個操作符所有操作數都是基本類型,則該操作符無法重載。
操作符重載不會改變編譯器預定義的優先級
操作符重載無法改變操作數的個數
無法通過操作符重載發明新的符号
隻能使用成員形式不能使用全局形式的操作符(= 、()、->)