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...