程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++沒法重載點符號、::、sizeof等的緣由

C++沒法重載點符號、::、sizeof等的緣由

編輯:關於C++

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 重載不克不及轉變運算符操作數的個數。好比+須要兩個操作數,則重載的+也必需要有兩個操作數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved