1. 程式人生 > >c++運算符重載筆記

c++運算符重載筆記

cti ron 優先 i/o 連接 his 重載方式 ast 功能

運算符重載的概念:給原有的運算符賦予新的功能;

比如:+ 不僅可以做算術運算也可以連接倆個字符串

一元運算符:只與一個操作數進行運算 比如 正負號

運算符重載的本質是:函數重載。

<<與>>符號只能通過友元函數來重載//因為其返回的對象是i/ostream中的

索引運算符[]只能通過成員函數進行重載,不能使用友元函數進行重載//因為其返回必須是this指針

總結

兩種重載方式的比較:

  • 一般情況下,一元運算符最好重載為類的成員函數;二元運算符則最好重載為類的友元函數。
  • 以下一些二元運算符不能重載為類的友元函數:=、()、[]、->。
  • 類型轉換函數只能定義為一個類的成員函數而不能定義為類的友元函數。 C++提供4個類型轉換函數:reinterpret_cast(在編譯期間實現轉換)、const_cast(在編譯期間實現轉換)、stactic_cast(在編譯期間實現轉換)、dynamic_cast(在運行期間實現轉換,並可以返回轉換成功與否的標誌)。
  • 若一個運算符的操作需要修改對象的狀態,選擇重載為成員函數較好。
  • 若運算符所需的操作數(尤其是第一個操作數)希望有隱式類型轉換,則只能選用友元函數。
  • 當運算符函數是一個成員函數時,最左邊的操作數(或者只有最左邊的操作數)必須是運算符類的一個類對象(或者是對該類對象的引用)。如果左邊的操作數必須是一個不同類的對象,或者是一個內部 類型的對象,該運算符函數必須作為一個友元函數來實現。
  • 當需要重載運算符具有可交換性時,選擇重載為友元函數。

註意事項:

  1. 除了類屬關系運算符”.“、成員指針運算符”.*“、作用域運算符”::“、sizeof運算符和三目運算符”?:“以外,C++中的所有運算符都可以重載。
  2. 重載運算符限制在C++語言中已有的運算符範圍內的允許重載的運算符之中,不能創建新的運算符。
  3. 運算符重載實質上是函數重載,因此編譯程序對運算符重載的選擇,遵循函數重載的選擇原則。
  4. 重載之後的運算符不能改變運算符的優先級和結合性,也不能改變運算符操作數的個數及語法結構。
  5. 運算符重載不能改變該運算符用於內部類型對象的含義。它只能和用戶自定義類型的對象一起使用,或者用於用戶自定義類型的對象和內部類型的對象混合使用時。
  6. 運算符重載是針對新類型數據的實際需要對原有運算符進行的適當的改造,重載的功能應當與原有功能相類似,避免沒有目的地使用重載運算符。

c++運算符重載筆記