日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C语言中能运算符重载吗,C++语言中什么运算符不能重载

發布時間:2024/6/1 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中能运算符重载吗,C++语言中什么运算符不能重载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2016-09-01 回答

c語言沒有重載的概念,重載是c++的內容

c++運算符:

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

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

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

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

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

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

不能重載的總共五個:

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

(2)" .*"(類成員指針訪問運算符)

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

(4)"siezof"(長度運算符)

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

還有就是:typeid.

其中

.*是c++的類成員函數指針調用運算符,是用來調用一個類函數指針的。

舉例:

假設有一個classa類擁有一個成員函數void classa::func(int i),則可以這么用:

1

2

3

4

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 {

public:

void f();

// ...

};

class x { // assume that you can overload . public:

y* p;

y& operator.() { return *p; }

void f();

// ...

};

void g(x& x)

{

x.f(); // x::f or y::f or error?

}

請注意:

1. 重載不能改變該運算符用于內置類型時的函義,程序員不能改變運算符+用于兩個int型時的含義。

2. 運算符函數的參數至少有一個必須是類的對象或者類的對象的引用。這種規定可以防止程序員運用運算符改變內置類型的函義。

3. 重載不能改變運算符的優先級。

4. 重載不能改變運算符的結合律。

5. 重載不能改變運算符操作數的個數。比如+需要兩個操作數,則重載的+也必須要有兩個操作數。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的C语言中能运算符重载吗,C++语言中什么运算符不能重载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。