C++無(wú)法重載點(diǎn)符號(hào)、::、sizeof等的原因
大多數(shù)的運(yùn)算符能夠被程序員重載。例外的是:
. (點(diǎn)符號(hào)) :: ?: sizeof
并沒(méi)有什么根本的原因要禁止重載?:。僅僅是因?yàn)?,我沒(méi)有發(fā)現(xiàn)有哪種特殊的情況需要重載一個(gè)三元運(yùn)算符。注意一個(gè)重載了 表達(dá)式1?表達(dá)式2:表達(dá)式3 的函數(shù),不能夠保證表達(dá)式2:表達(dá)式3 中只有一個(gè)會(huì)被執(zhí)行。
Sizeof 不能夠被重載是因?yàn)閮?nèi)建的操作(built-in operations),諸如對(duì)一個(gè)指向數(shù)組的指針進(jìn)行增量操作,必須依靠它??紤]一下:
X a[10]; X* p = &a[3]; X* q = &a[3]; p++; // p 指向a[4] // 那么p 的整型值必須比q 的整型值大出一個(gè)sizeof(X)
所以,sizeof(X)不能由程序員來(lái)賦予一個(gè)不同的新意義,以免違反基本的語(yǔ)法。
在N::m 中,無(wú)論N 還是m 都不是值的表達(dá)式;N 和m 是編譯器知道的名字,::執(zhí)行一個(gè)(編譯期的)范圍解析,而不是表達(dá)式求值。你可以想象一下,允許重載x::y 的話,x 可能是一個(gè)對(duì)象而不是一個(gè)名字空間(namespace)或者一個(gè)類,這樣就會(huì)導(dǎo)致——與原來(lái)的表現(xiàn)相反——產(chǎn)生新的語(yǔ)法(允許 表達(dá)式1::表達(dá)式2)。很明顯,這種復(fù)雜性不會(huì)帶來(lái)任何好處。
理論上來(lái)說(shuō),.(點(diǎn)運(yùn)算符)可以通過(guò)使用和->一樣的技術(shù)來(lái)進(jìn)行重載。但是,這樣做會(huì)導(dǎo)致一個(gè)問(wèn)題,那就是無(wú)法確定操作的是重載了.的對(duì)象呢,還是通過(guò).引用的一個(gè)對(duì)象。例如:
class Y {
public:
void f();
// ...
};
class X { // 假設(shè)你能重載.
Y* p;
Y& operator.() { return *p; }
void f();
// ...
};
void g(X& x){
x.f(); // X::f 還是Y::f 還是錯(cuò)誤?
}
附上C++重載的一些總結(jié)
重載操作符的限制:
1 并不是所有的操作符都能被重載。除了. ,.* ,:: ,? : ,sizeof,typeid這幾個(gè)運(yùn)算符不能被重載,其他運(yùn)算符都能被重載
2 重載不能改變?cè)撨\(yùn)算符用于內(nèi)置類型時(shí)的函義,程序員不能改變運(yùn)算符+用于兩個(gè)int型時(shí)的含義。
3 運(yùn)算符函數(shù)的參數(shù)至少有一個(gè)必須是類的對(duì)象或者類的對(duì)象的引用。這種規(guī)定可以防止程序員運(yùn)用運(yùn)算符改變內(nèi)置類型的函義。
4 重載不能改變運(yùn)算符的優(yōu)先級(jí)。
5 重載不能改變運(yùn)算符的結(jié)合律。
6 重載不能改變運(yùn)算符操作數(shù)的個(gè)數(shù)。比如+需要兩個(gè)操作數(shù),則重載的+也必須要有兩個(gè)操作數(shù)。
上一篇:C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)求n階勒讓德多項(xiàng)式的方法
欄 目:C語(yǔ)言
下一篇:C++利用鏈棧實(shí)現(xiàn)表達(dá)式求值
本文標(biāo)題:C++無(wú)法重載點(diǎn)符號(hào)、::、sizeof等的原因
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2286.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10fatal error LNK1104: 無(wú)法打開(kāi)文件“l(fā)ibc.lib”的解決方法
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改


