天天看點

C++中的重載運算

重載運算

當運算符被應用于類類型的對象時,C++語言允許我們為其指定新的含義,重新定義該運算符的含義。

基本概念

1)重載運算符本質上還是一個函數。是以也有函數相應的各種元素結構。 函數名:由關鍵字operator 和對應的運算符組成。 參數:參數數量和運算符作用的運算符對象個數一樣多, 成員運算符函數的左側運算對象隐式地綁定到this上。 2)可以重載大多數但并不是全部大運算符。不能重載的運算符有:( ::     .*    .    ? :  )。 3)隻能重載已有的運算符,不能發明新的運算符。 4)對于一個運算符函數來說,它要麼是類的成員,要麼至少含有一個類類型參數。 5)通常情況下,不應該重載逗号、取址、邏輯與、邏輯或這幾種運算符。 6)在定義重載運算符時,應盡量使用與内置類型一緻的含義。 7)對于将運算符作為成員還是非成員函數,可以考慮一下幾方面:a)指派、下标、調用、成員通路箭頭運算符必須是成員;b)複合指派運算符一般作為成員,但非必須;c)改變運算對象狀态的運算符或者和給定類型密切相關的運算符,通常應該是成員;d)具有對稱性的運算符可能轉換任意一端的運算對象,通常為非成員。

輸入輸出運算符

1)輸入輸出運算符必須是非成員函數。

2)通常情況下,輸出運算符的第一個形參是一個非常量ostream對象的引用,第二個形參一般是一個常量的引用。

3)通常情況下,輸入運算符的第一個形參是将要讀取流的引用,第二個形參是将要讀入到的對象的引用;輸入運算符需要有處理輸入失敗的情況。

算術運算符

通常情況下将算術運算符定義成非成員能函數,允許左側或者右側運算對象進行轉換,形參通常是常量的引用。

關系運算符

1)通常情況下将關系運算符定義成非成員能函數,允許左側或者右側運算對象進行轉換,形參通常是常量的引用。

2)對于相等運算符,隻有類類型中的所有資料成員都相等才認為兩個對象相等。

3)通常關系運算符應該:a) 定義順序關系,令其與關聯容器中對關鍵字的要求一緻;b)如果類同時也含有==運算符,則定義一種關系令其與==保持一緻。

指派運算符

1)不論形參的類型是什麼嘛,指派運算符都必須定義為成員函數。 2)複合指派運算符盡量定義成成員函數,為了與内置類型的複合指派保持一直,通常傳回類型為左側運算對象的引用。

下标運算符

1)下标運算符必須是成員函數。 2)下标運算符傳回的對象通常是所通路元素的引用,可以放在指派運算符的任何一端,是以最好定義常量和非常量版本的兩種下标運算符。

遞增和遞減運算符

1)建議将這兩種運算符定義為成員函數。 2)為和内置類型一緻,最好定義前置版本和後置版本兩種運算符。

繼續閱讀