過載運算子
一,知識點總結
過載運算子函式可以對運算子做出新的解釋,即定義使用者所需要的各種操作。但運算子過載後,原有的基本語義不變,包括:
○不改變運算子的優先順序
○不改變運算子的結合性
○不改變運算子所需要的運算元
○不能建立新的運算子
優先順序和結合性主要體現在過載運算子的使用上,而運算元的個數不但體現在過載運算子的使用上,更關係到函式定義時的引數設定。
c++
允許在同一作用域中的某個函式和運算子指定多個定義,分別稱為函式過載和運算子過載。
過載宣告是指乙個與之前已經在該作用域內宣告過的函式或方法具有相同名稱的宣告,但是它們的引數列表和定義(實現)不相同。
當您呼叫乙個過載函式或過載運算子時,編譯器通過把您所使用的引數型別與定義中的引數型別進行比較,決定選用最合適的定義。選擇最合適的過載函式或過載運算子的過程,稱為過載決策。
1,過載運算子的語法形式
運算子函式是一種特殊的成員函式或者友元函式。成員函式的語句格式為:
型別 類名::operator op(參數列)
「型別」是函式的返回型別。「類名」是要過載該運算子的類。「op」表示要過載的運算子。函式名是「operator op」,由關鍵字operator和被過載的運算子op組成。「參數列」列出該運算子所需要的運算元。
用於類計算的運算子通常都要過載。但有兩個運算子系統提供預設過載版本:
○賦值運算子「=」,系統預設過載為物件資料成員的複製:
○位址運算子「&」,系統預設過載為返回任何類物件的位址
2,用成員或友元函式過載運算子
(1)一元運算子
一元運算子不論前置或後置,都要求有乙個運算元:
object op 或 op object
當過載為成員函式時,編譯器解釋為:
object.operator op()
函式operator op所需的運算元由物件object通過this指標隱含傳遞,所以參數列為空
當過載為友元函式時,編譯器解釋為:
operator op(object)
函式operator op 所需的運算元由參數列的引數object提供。
(2)二元運算子
任何二元運算子都要求有左,右運算元:
objectl op objectr
當過載為成員函式時,編譯器解釋為:
objectl.operator op(opjectr)
左運算元由物件objectl通過this指標傳遞,右運算元由引數objectr傳遞。
過載為友元函式時,編譯器解釋為:
operator op(objectl,objectr)
左右運算元都由引數傳遞。
不管是成員函式還是友元函式過載,運算子的使用方法都相同。但由於它們傳遞引數的方法不同,因此導致實現的**不同,應用場合也不同。
2,用成員函式過載運算子
成員運算子函式的原型在類的內部宣告格式如下:
class x
在類外定義成員運算子函式的格式如下:
返回型別 x::operator運算子(形參表)
對雙目運算子而言,成員運算子函式的形參表中僅有乙個引數,它作為運算子的右運算元,此時當前物件作為運算子的左運算元,它是通過this指標隱含地傳遞給函式的。
一般而言,採用成員函式過載單目運算子時,以下兩種方法是等價的:
@aa; // 隱式呼叫
aa.operator@(); // 顯式呼叫
成員運算子函式operator @所需的乙個運算元由物件aa通過this指標隱含地傳遞。因此,在它的參數列中沒有引數。
3,用友元函式過載運算子
ø在第乙個引數需要隱式轉換的情形下,使用友元函式過載
運算子是正確的選擇
ø友元函式沒有 this 指標,所需運算元都必須在參數列顯式
宣告,很容易實現型別的隱式轉換
øc++中不能用友元函式過載的運算子有
= () [] ->
4,幾個典型運算子過載
設 a aobject ;
運算子 ++和 - - 有兩種方式:
前置方式:
++aobject --aobject
成員函式 過載
a :: a operator++ () ;
解釋為:
aobject . operator ++( ) ;
友元函式 過載
friend a operator++ (a &) ;
解釋為:
operator ++( aobject ) ;
後置方式:
aobject ++ aobject --
成員函式 過載
a :: a operator++ (int) ;
解釋為:
aobject . operator ++( 0 ) ;
友元函式 過載:
friend a operator++ (a &, int) ;
解釋為:
operator++(aobject, 0)
5,過載賦值運算子
▲賦值運算子過載用於物件資料的複製
▲ operator= 必須過載為成員函式
▲過載函式原型為:
類名 & 類名 :: operator= ( 類名 ) ;
6,過載流插入和流提取運算子
▲ istream 和 ostream 是c++預定義流類
▲ cin 是istream 的物件,cout是ostream的物件
ø運算子 << 由ostream 過載為插入操作,用於輸出基本型別資料
ø運算子 >> 由 istream 過載為提取操作,用於輸入基本型別資料
ø用友元函式過載 << 和 >> ,輸出和輸入使用者自定義的資料型別
過載輸出運算子「<<」(只能被過載成友元函式,不能過載成成員函式)
定義輸出運算子「<<」過載函式的一般格式如下:
ostream& operator<<(ostream& out,class_name& obj)
二,典型**
過載「+」運算子
#includeusing namespace std;
class xiangjia
xiangjia(double e,double g)
xiangjia operator+(xiangjia&c);
void display();
private:double a;double b;
};xiangjia xiangjia::operator+(xiangjia&c)
void xiangjia::display()
distance(int f, int i)
void operator=(const distance &d )
// 顯示距離的方法
void displaydistance()
};int main()
三,心得體會
對於過載運算子,感覺他很方便,我們可以自己定義運算,讓那些符號按照我們的意願去做某些運算,
那些運算子本身功能是有限的
比如不能進行複數的加減 但是我們過載以後 就可以讓它實數與實數相加,虛數與虛數相加,最後結果也是複數還有字串string裡也有很多過載的地方,像兩個字串也可以相加,等等 過載的主要目的是,簡潔易懂,原理上其實也是通過函式實現的。所以過載運算子很方便,很省事。
運算子過載總結
過載為普通函式 正常情況下都是友元函式 時,引數個數為運算子目數 過載為成員函式時,引數個數為運算子目數減1.一般情況下,單目運算子最好過載為類的成員函式 雙目運算子則最好過載為類的友元函式。什麼情況下成員函式不能解決問題?比如complex c c 5相當於呼叫c.operator 5 可以用 但...
c 運算子過載總結
目錄 1.一般運算子過載 2.關係運算子過載 3.邏輯運算子過載 4.單目運算子過載 5.自增減運算子過載 6.位運算子過載 7.賦值運算子過載 8.記憶體運算子過載 9.特殊運算子過載 10.總結c 的一大特性就是過載 overload 通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔 ...
C 運算子過載總結
c 的一大特性就是過載 overload 通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔 高效。在c 中不止函式可以過載,運算子也可以過載。由於一般資料型別間的運算子沒有過載的必要,所以運算子過載主要是物件導向之間的。1.一般運算子過載 在進行物件之間的運算時,程式會呼叫與運算子相對應的...