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++语言中什么运算符不能重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业c语言的编程风格,c语言优秀编程风格
- 下一篇: Android 代码实现整数处理为小数,