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è)類(lèi),這樣就會(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)置類(lèi)型時(shí)的函義,程序員不能改變運(yùn)算符+用于兩個(gè)int型時(shí)的含義。
3 運(yùn)算符函數(shù)的參數(shù)至少有一個(gè)必須是類(lèi)的對(duì)象或者類(lèi)的對(duì)象的引用。這種規(guī)定可以防止程序員運(yùn)用運(yùn)算符改變內(nèi)置類(lèi)型的函義。
4 重載不能改變運(yùn)算符的優(yōu)先級(jí)。
5 重載不能改變運(yùn)算符的結(jié)合律。
6 重載不能改變運(yùn)算符操作數(shù)的個(gè)數(shù)。比如+需要兩個(gè)操作數(shù),則重載的+也必須要有兩個(gè)操作數(shù)。
相關(guān)文章
C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法示例
這篇文章主要介紹了C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法,結(jié)合實(shí)例形式分析了C++遞歸函數(shù)與逆序棧的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05基于C語(yǔ)言實(shí)現(xiàn)迷宮游戲的示例代碼
這篇文章主要介紹了基于C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的迷宮游戲,對(duì)于學(xué)習(xí)游戲開(kāi)發(fā)的朋友相信有一定的借鑒價(jià)值,需要的朋友可以參考下2022-05-05OpenCV3實(shí)現(xiàn)車(chē)牌識(shí)別(C++版)
這篇文章主要為大家詳細(xì)介紹了OpenCV3實(shí)現(xiàn)車(chē)牌識(shí)別功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08詳細(xì)分析c++ const 指針與指向const的指針
這篇文章主要介紹了c++ const 指針與指向const的指針的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07C++實(shí)現(xiàn)LeetCode(23.合并k個(gè)有序鏈表)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(23.合并k個(gè)有序鏈表),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07