C 中不能過載的運算子

2021-07-09 09:35:41 字數 1072 閱讀 9956

c++中不能過載的運算子:「?:」、「.」、「::」、「sizeof」和」.*」,原因如下:

在具體講解各個運算子不能過載之前,先來說明下【過載】:過載的本意是讓操作符可以有新的語義,而不是更改語法——否則會引起混亂。

【注】過載的部分規則:運算子函式的引數至少有乙個必須是類的物件或者類的物件的引用。

(1).「?:」運算子,假如能夠過載,那麼問題來了,看下面的語句:

exp1?exp2:exp3
該運算子的本意是執行exp2和exp3中的乙個,可是過載後,你能保證只執行了乙個嗎?還是說兩個都能執行?亦或兩條都不能執行? 「?:」運算子的跳轉性質就不復存在了,這就是「?:」運算子不能夠被過載的最主要原因。

(2).「.」運算子,假如能夠過載,那麼,問題來了,看下面的例子:

class y ;

class x

void fun();

// ...

};void g(x& x)

「.」運算子的本意是引用物件成員的,然而被過載後就不能保證本意,從而帶來運算子意義的混淆,如果每個人都這麼過載,那更不容易學習c++語言了。

(3).「::」運算子,m::a,該運算子只是在編譯的時候域解析,而沒有運算的參與進來,由前面【注】重規則可知,如果過載之後,::運算子有了新的語義,那是不是會引起混淆呢?

(4).「sizeof」運算子,該運算子不能被過載的主要原因是內部許多指標都依賴它,舉例說明過載的後果:

​​a b[10];//a是類

a* p = &a[3];

a* q = &a[3];

p++;//執行後,p指向a[4],記住是指向a[4]!根據c++規定,該操作等同於p+sizeof(a),此時

​ //p應該比q大a類所佔位元組的大小,事實上,p並不一定會比q大這麼多,因為你把sizeof()運算

​ //符過載了啊!這時的sizeof(a)並不一定是該類占用的位元組大小!

(5)」.*」引用指向類成員的指標

【注】如果有**解釋不當的地方,歡迎一起**~

c 中不能過載的運算子

算術運算子 位操作運算子 位異或 左移 右移 邏輯運算子 比較運算子 賦值運算子 其他運算子 逗號運算子 new,delete,new,delete,不能過載的5個運算子 siezof 1.運算子過載後,優先順序和結合性怎麼辦?使用者過載新定義運算子,不改變原運算子的優先順序和結合性。這就是說,對運...

c 中不能過載的運算子

算術運算子 位操作運算子 位異或 左移 右移 邏輯運算子 比較運算子 賦值運算子 其他運算子 逗號運算子 new,delete,new,delete,不能過載的5個運算子 siezof 1.運算子過載後,優先順序和結合性怎麼辦?使用者過載新定義運算子,不改變原運算子的優先順序和結合性。這就是說,對運...

c 中不能過載的運算子

c 運算子 算術運算子 位操作運算子 位異或 左移 右移 邏輯運算子 比較運算子 賦值運算子 其他運算子 逗號運算子 new,delete,new,delete,不能過載的總共五個 1 類成員訪問運算子 2 類成員指標訪問運算子 3 域運算子 4 siezof 和 typeid 長度運算子和rtti...