C++沒法重載點符號、::、sizeof等的緣由。本站提示廣大學習愛好者:(C++沒法重載點符號、::、sizeof等的緣由)文章只能為提供參考,不一定能成為您想要的結果。以下是C++沒法重載點符號、::、sizeof等的緣由正文
年夜多半的運算符可以或許被法式員重載。破例的是:
. (點符號) :: ?: sizeof
並沒有甚麼基本的緣由要制止重載?:。僅僅是由於,我沒有發明有哪一種特別的情形須要重載一個三元運算符。留意一個重載了 表達式1?表達式2:表達式3 的函數,不克不及夠包管表達式2:表達式3 中只要一個會被履行。
Sizeof 不克不及夠被重載是由於內建的操作(built-in operations),諸如對一個指向數組的指針停止增量操作,必需依附它。斟酌一下:
X a[10]; X* p = &a[3]; X* q = &a[3]; p++; // p 指向a[4] // 那末p 的整型值必需比q 的整型值年夜出一個sizeof(X)
所以,sizeof(X)不克不及由法式員來付與一個分歧的新意義,以避免違背根本的語法。
在N::m 中,不管N 照樣m 都不是值的表達式;N 和m 是編譯器曉得的名字,::履行一個(編譯期的)規模解析,而不是表達式求值。你可以想象一下,許可重載x::y 的話,x 能夠是一個對象而不是一個名字空間(namespace)或許一個類,如許就會招致——與本來的表示相反——發生新的語法(許可 表達式1::表達式2)。很顯著,這類龐雜性不會帶來任何利益。
實際下去說,.(點運算符)可以經由過程應用和->一樣的技巧來停止重載。然則,如許做會招致一個成績,那就是沒法肯定操作的是重載了.的對象呢,照樣經由過程.援用的一個對象。例如:
class Y { public: void f(); // ... }; class X { // 假定你能重載. Y* p; Y& operator.() { return *p; } void f(); // ... }; void g(X& x){ x.f(); // X::f 照樣Y::f 照樣毛病? }
附上C++重載的一些總結
重載操作符的限制:
1 其實不是一切的操作符都能被重載。除. ,.* ,:: ,? : ,sizeof,typeid這幾個運算符不克不及被重載,其他運算符都能被重載
2 重載不克不及轉變該運算符用於內置類型時的函義,法式員不克不及轉變運算符+用於兩個int型時的寄義。
3 運算符函數的參數至多有一個必需是類的對象或許類的對象的援用。這類劃定可以避免法式員應用運算符轉變內置類型的函義。
4 重載不克不及轉變運算符的優先級。
5 重載不克不及轉變運算符的聯合律。
6 重載不克不及轉變運算符操作數的個數。好比+須要兩個操作數,則重載的+也必需要有兩個操作數。