2:將算術運算符和關係運算符定義成非成員函數,可以允許左右側對象進行轉換。因爲這些運算符不需要改變運算對象的狀態,所以一般不需要定義成成員函數,所以一般 運算對象爲常量引用。
3:一般算術運算符的實現都用 符合賦值運算符(+=,-=等)實現。
4:定義類的 operator== 後,更容易使用標準容器和算法。定義了 operator== 後,也應該定義 operator!= 。反之亦然。相等和不相等運算符的工作應該只委託給一個,另一個調用被委託的關係比較。
5:如果存在唯一一種邏輯可靠的 < 定義,則應該考慮爲這個類定義 < 運算符。
6:賦值運算符必須是成員函數,符合賦值運算符可以是成員函數,也可以是非成員函數,然而一般都作爲成員函數。
7:下標運算符必須作爲成員函數,並且下標運算符返回一個元素的引用,要定義一個常量版本和非常量版本。 要加 const 的限定符修飾調用對象的 this 指針,並且返回值也要是 const 修飾。
8:C++中定義的 ++ 和 -- 運算符有前置和後置版本,在定義該類運算符時,我們用參數去區分兩類版本,不帶參數的爲前置版本,帶參數(int)的爲後置版本。與內置版本保持一致,我們應該返回後至版本的原值。後置版本利用前置版本去實際運算。增加函數的可讀性是非常重要的。
9:重載箭頭運算符,我們要麼使用內置類型的 -> ,
pointer->mem;
1)如果該調用 pointer 是一個類的指針,那麼則執行 (*pinter).mem 內置版本調用
2)如果 pointer 是一個對象,該對象定義了 operator->(),那麼執行 pointer.operator->() ,如果該調用結果返回的是一個指針,則執行1)中過程,如果是一個對象,則執行2) 直到最後得到訪問結果。
10:箭頭運算符返回的一定只能是指針,或者是一個定義 operator->() 的類的對象。
11:函數調用運算符,可以使得我們把一個類對象當做一個函數名來用。這樣就像調用一個函數名爲類對象名的函數一樣(不是構造函數啊),完成某種功能。
12:如果一個類定義了函數調用運算符,我們稱該類是一個函數對象,因可以調用這種對象,這些對象的行爲像函數一樣。