c 中不能過載的運算子

2021-07-10 23:11:33 字數 1784 閱讀 1187

c++運算子:

算術運算子:+,-,*,/,%,++,--;

位操作運算子:&,|,~,^(位異或),<<(左移),>>(右移)

邏輯運算子:!,&&,||;

比較運算子:<,>,>=,<=,==,!=;

賦值運算子:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;

其他運算子:,(),->,,(逗號運算子),new,delete,new,delete,->*。

不能過載的總共五個:

(1) "."(類成員訪問運算子)

(2)" .*"(類成員指標訪問運算子)

(3) "::"(域運算子)

(4)"siezof"和"typeid()"(長度運算子和rtti中的型別判斷)

(5) " ?:"(條件運算子)

(6)還有就是:"#"預處理操作符.

其中.*是c++的類成員函式指標呼叫運算子,是用來呼叫乙個類函式指標的。

舉例:假設有乙個classa類擁有乙個成員函式void classa::func(int i),則可以這麼用:

void (classa::*fp)(int i) // 定義乙個類函式指標。

classa obj;

fp = &classa::func; // 給這個類函式指標賦值

(obj.*fp)(5); // 這麼用,相當於呼叫obj.func(5);

沒有什麼非禁止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. 過載不能改變該運算子用於內建型別時的函義,程式設計師不能改變運算子+用於兩個int型時的含義。

2. 運算子函式的引數至少有乙個必須是類的物件或者類的物件的引用。這種規定可以防止程式設計師運用運算子改變內建型別的函義。

3. 過載不能改變運算子的優先順序。

4. 過載不能改變運算子的結合律。

5. 過載不能改變運算子運算元的個數。比如+需要兩個運算元,則過載的+也必須要有兩個運算元。

c 中不能過載的運算子

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

c 中不能過載的運算子

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

C 中不能過載的運算子

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