運算子過載限制 不能過載的運算子

2021-08-20 21:09:46 字數 1049 閱讀 5058

1.過載後的運算子必須至少有乙個操作符是使用者定義的型別。

2.使用運算子不能違反運算子原來的句法規則。

3.不能新建運算子

4.不能過載: sizeof ,  . ,   .* ,   ::  ,  ?:  , const_cast, dynamic_cast, reinterpret_cast, static_cast

5.只能通過成員函式過載的運算子: = ,  ( ) ,  [ ] ,  ->

限制說明:

函式過載(多型)是使用者可以定義多個名稱相同但返回列表或引數列表不同的函式,運算子過載將函式過載概念擴充套件到了運算子上

過載是為了讓使用者更方便的實現自己所需要的額外功能,擴充套件使用者自定義的型別。如果乙個過載運算子造成了混淆,或者不符合大多數人的認知,例如將-(減號)過載為兩個運算元相加的結果,這樣的過載是沒有意義的。

一下對以上幾條進行解釋:

1.顯而易見,標準的運算子過載沒有必要,如果不是對自定義型別進行擴充套件,過載就會造成混淆,例如:對兩個double過載+(加),無論實現為什麼結果,對其它人來說,都是莫名其妙的,因為對大眾來說+(加)就是兩個數的相加

2,3.同上,維護的成本遠高於創新的成本,對3來說,新運算子無法確定其優先順序

4.這幾個操作符,前面幾個在底層或者在類中都是普遍使用的,在c中也有普遍使用,除了造成混淆以外,這幾個操作運算子使用起來語義型別都是比較明確的,sizeof提供資料所分配的記憶體大小,c++中 static_cast,const_cast,reinterpret_cast幾個是型別轉換,操作的是物件,如果過載了有可能會破壞原來的安全機制

5.如果定義為非成員,編譯器會報錯。即使可以定義為非成員,舉例「=」,也就是試圖定義內建「=」,編譯器依然會通過強制operator=為成員函式

補充:operator《或》應該為非成員運算子,因為輸出輸入流是乙個基本c++庫

非成員與成員選擇方針:

所有一員運算子

成員=, (),, ->, ->*

必須是成員

+=, -=, /=, *=, ^=, &=,%=,>>=, <<=

成員所有其它二元運算子

非成員

運算子過載的限制

運算子過載是一種形式的c 多型,其隱藏了運算內部的機理,並強調了實質,這是oop的乙個目標。過載的運算子是左結合的,左運算元為呼叫物件,一般格式如下 返回型別說明符 operator 運算子符號 參數列 運算子過載有以下限制 1 過載後的運算子必須至少有乙個運算元是使用者定義的型別,這樣就防止了過載...

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...