c 中為什麼有不能過載的運算子(摘錄)

2021-05-25 17:36:21 字數 1067 閱讀 2344

大部分的操作符是可以被過載的,例外的只有「.」、「::」、「?:」和「sizeof」。沒有什麼非禁止operator?:過載的理由,只不過沒有必要而已。另外,expr1?expr2:expr3的過載函式無法保證expr2和expr3中只有乙個被執行。

而「sizeof」無法被過載是因為不少內部操作,比如指標加法,都依賴於它,例如:

x a[10];

x* p = &a[3];

x* q = &a[3];

p++; // p points to a[4]

// thus the integer value of p must be

// sizeof(x) larger than the integer value of q

這樣,sizeof(x)無法在不違背基本語言規則的前提下表達什麼新的語義。

在n::m中,n和m都不是表示式,它們只是編譯器「認識」的名字,「::」執行的實際操作是編譯時的名字域解析,並沒有表示式的運算牽涉在內。或許有人會覺得過載乙個「x::y」(其中x是實際物件,而非名字域或類名)是乙個好主意,但這樣做引入了新的語法[譯註:過載的本意是讓操作符可以有新的語義,而不是更改語法——否則會引起混亂],我可不認為新語法帶來的複雜性會給我們什麼好處。

原則上來說,「.」運算子是可以被過載的,就像「->」一樣。不過,這會帶來語義的混淆——我們到底是想和「.」後面的物件打交道呢,還是「.」後面的東東所實際指向的實體打交道呢?看看這個例子(它假設「.」過載是可以的):

class y ;

class x

void f();

// ...

}; void g(x& x)

在 < >中這樣寫道:

在可用的運算子集合裡存在一些不能過載的運算子。這樣限制的通常原因是出於對安全的考慮:如果這些運算子也可以被過載的話,將會造成危害或破壞安全機制,使得事情變得困難或混淆現有的習慣。

現在,成員選擇運算子『.』在類中對任何成員都有一定的意義。但如果允許它過載,就不能用普通的方法訪問成員,只能用指標和指標運算子->訪問。

成員指標逆向引用的運算子『.* 』因為與運算子『.』同樣的原因而不能過載。

c 中不能過載的運算子

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

c 中不能過載的運算子

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

C 中不能過載的運算子

c 中不能過載的運算子 sizeof 和 原因如下 在具體講解各個運算子不能過載之前,先來說明下 過載 過載的本意是讓操作符可以有新的語義,而不是更改語法 否則會引起混亂。注 過載的部分規則 運算子函式的引數至少有乙個必須是類的物件或者類的物件的引用。1 運算子,假如能夠過載,那麼問題來了,看下面的...