首頁 >後端開發 >C#.Net教程 >C++運算子中不能重載的是哪些

C++運算子中不能重載的是哪些

青灯夜游
青灯夜游原創
2020-12-21 15:20:1514402瀏覽

C 運算子中不能重載的有:1、條件運算子「?:」;2、成員存取運算子「.」;3、域運算子「::」;4、長度運算符「sizeof」;5、成員指標存取運算子「->*」和「.*」 。

C++運算子中不能重載的是哪些

相關推薦:《C 影片教學

重載:讓運算子可以有新的語義,而不是更改語法,否則會造成混亂。 

重載的部分規則:運算函數的參數至少有一個必須是類別的物件或類別的物件的參考。

而C 中無法重載的運算子有5個,分別為:

  • 「?:」(條件運算子)

  • “.”(成員存取運算子)

  • “::”(網域運算子)

  • “sizeof” (長度運算子)

  • “->*”和“.*” (成員指標存取運算子)

那麼這幾個運算子為什麼不能進行重載?原因介紹:

(1)「?:」

#假設可以重載,那我們來看下列的程式碼:

exp1 ? exp2 : exp3

該運算子的意思是執行exp2和exp3中的一個,假設重載了,就不可以保證執行一個還是兩個,還是都沒執行,該運算子的跳轉性質就不復存在了。所以,「?:」不能被重載。

(2)“.”

假設可以重載,我們可以假設一種情況,創建一個對象,呼叫該對象的函數。

class Y{
   public:
      void fun();
};
class X{
   public:
      Y* p;
      Y& operator.(){
          return *p;
      }
      void fun();
}
void g(X& x){
      x.fun();
}

這個例子中,x.fun()就不知道是呼叫哪一個fun函數了。 
「.」運算子的意思是引用物件成員,然而被重載後就不能保證了,導致運算子意義的混淆。

(3)“::”

該運算子只是在編譯的時候域解析,而沒有運算參與。根據重載的規則,如果重載該運算符,就賦予了新的語義,可能會出現混淆。

(4)“sizeof”

#不能被重載的原因主要是內部許多指標都依賴sizeof。

(5)“->*”和“.*”

#引用指向類別成員的指標

更多程式設計相關知識,請造訪:程式設計入門! !

以上是C++運算子中不能重載的是哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn