国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++無法重載點(diǎn)符號(hào)、::、sizeof等的原因

2020-05-23 14:04:01
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++無法重載點(diǎn)符號(hào)、::、sizeof等的原因的相關(guān)資料,需要的朋友可以參考下
 

大多數(shù)的運(yùn)算符能夠被程序員重載。例外的是:

    . (點(diǎn)符號(hào)) :: ?: sizeof

并沒有什么根本的原因要禁止重載?:。僅僅是因?yàn)椋覜]有發(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)不能由程序員來賦予一個(gè)不同的新意義,以免違反基本的語法。

在N::m 中,無論N 還是m 都不是值的表達(dá)式;N 和m 是編譯器知道的名字,::執(zhí)行一個(gè)(編譯期的)范圍解析,而不是表達(dá)式求值。你可以想象一下,允許重載x::y 的話,x 可能是一個(gè)對(duì)象而不是一個(gè)名字空間(namespace)或者一個(gè)類,這樣就會(huì)導(dǎo)致——與原來的表現(xiàn)相反——產(chǎn)生新的語法(允許 表達(dá)式1::表達(dá)式2)。很明顯,這種復(fù)雜性不會(huì)帶來任何好處。

理論上來說,.(點(diǎn)運(yùn)算符)可以通過使用和->一樣的技術(shù)來進(jìn)行重載。但是,這樣做會(huì)導(dǎo)致一個(gè)問題,那就是無法確定操作的是重載了.的對(duì)象呢,還是通過.引用的一個(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ù)。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 青浦区| 通辽市| 河南省| 湖州市| 南靖县| 靖安县| 海安县| 南京市| 湘乡市| 通榆县| 白玉县| 获嘉县| 博兴县| 杭锦后旗| 汪清县| 昆明市| 北辰区| 富蕴县| 四会市| 太仆寺旗| 大姚县| 兴海县| 虹口区| 合川市| 淄博市| 永平县| 当涂县| 黄大仙区| 仁怀市| 临猗县| 辉县市| 嘉祥县| 岐山县| 南京市| 石泉县| 甘肃省| 股票| 澄迈县| 大同县| 内乡县| 锦屏县|