C++中重載運算符
注意事項:
- 重載運算符函數要求必須有一個參數為類對象.
- 重載運算符函數不可以有默認參實參.(
operator()
除外) - 重載運算符函數的參數個數與運算符作用的運算對象數量相同, 對於二元運算符來說,左側運算符對象傳遞給第一個參數,右側運算符對象傳遞給第二個參數.
- 重載之后的運算符本質上就是一個函數調用, 原生運算符的求值順序以及運算符的短路屬性並不會保留下來.
C++中哪些運算符可以重載?
大多數運算符都可以重載,有4個運算符不可以重載. 分別是: 作用域運行符::
/成員訪問運算符.
/成員訪問指針運算符.*
(c++primer第7339頁)/三目運算符? :
.
哪些運算符應該作為類成員函數進行重載?
- 5個運算符必須作為類成員函數進行重載: 賦值運算符
=
/下標運算符[]
/箭頭運算符->
/函數調用運算符()
, 以及類型轉換運算符. - 改變對象狀態的運算符以及與給定類型非常相關的運行符,建立寫為類成員運算符. 例如: 復合賦值運算符/
++
或--
運算符/解引用運算符*
等. - 具有對稱性的運算符通常為普通的非成員運算符, 例如: 關系/相等/算術運算符等.
- 輸入輸出運算符(
>>
和<<
)必須是普通的非類成員函數,因為:如果是類成員函數的話,this指針綁定在第一個參數上了, 寫法不符合常規了(例如: 類對象 << cout).
重載運算符時,有哪些值得注意的事項?
- 算術運算符應該返回類型的值, 賦值運算符/復合賦值運算符應該返回左側運算對象的引用,
- 如果一個類有算術運算符,則也應該定義它的復合賦值運算符, 並且算術運算符的功能由復合賦值運算符來完成.
- 下標運算符通常返回所訪問對象元素的引用作為返回值,並且通常是返回普通引用,另一個是作為類的常量成員並返回常量引用, 這樣一來就可以作用於常量對象了.
- 前置遞增遞減運算符返回對象的引用, 后置遞增遞減運算符多了一個int類型形參,並且返回類型為臨時對象的值.
- 解引用運算符(
*
)與箭頭運算符(->
)關系比較密切. 解引用運算符返回一個對象的引用. 箭頭運算符返回對象的指針,而該對象是通過調用解引用運算符函數得到, 再加一個取地址符. - 關於箭頭運算符,它比較特殊,: 它永遠不能丟掉成員訪問的基本含義, 當我們重載箭頭時,可以改變的只有它從哪個對象當中獲到成員.因此, 重載箭頭運算符時的返回值必須是指向類對象的指針或一個重載了
->
的類對象. - 類型轉換運算符沒有顯式的返回類型,也沒有形參.
怎么能熟悉運算符重載?
平時基本很少寫運算符重載的相關代碼, 想要熟悉,只能多使用他們!!!