C 中有哪些運算子不能過載?

2021-06-04 14:31:58 字數 842 閱讀 8079

大部分的操作符是可以被過載的,例外的只有「.」、「::」、「?:」和「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)

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

1.過載後的運算子必須至少有乙個操作符是使用者定義的型別。2.使用運算子不能違反運算子原來的句法規則。3.不能新建運算子 4.不能過載 sizeof const cast,dynamic cast,reinterpret cast,static cast 5.只能通過成員函式過載的運算子 限制說明 ...

c 中不能過載的運算子

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

c 中不能過載的運算子

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