2012-06-05 58 views
1

可能重複:
Accessing class members on a NULL pointerNULL指針能夠訪問類的成員函數

一個很愚蠢的問題,或者可能是我的概念性疑問。

#include <iostream> 

    using namespace std; 

    class A 
    { 
      public: 
      void print() 
      { 
        cout<<"Printing\n"; 
      } 
    }; 

    int main() 
    { 
      A * a = NULL; 
      a->print(); 
      return 0; 
    } 

輸出是:打印

如何爲a指針(即NULL)能夠訪問A類的成員函數

請解釋...可能是它只是一個愚蠢的問題但我有一個空指針不能訪問類的成員函數的印象。

+3

你只是不幸,它沒有訂購披薩。下次更好運氣。 –

+1

@R。 Martinho Fernandes:我只是喜歡未定義的行爲讓我吃披薩! ;) –

+1

@ K-ballo,當我的未定義行爲命令某事時,它從來沒有披薩那麼愉快。 –

回答

6

像在代碼中那樣取消引用NULL指針是未定義的行爲。這種未定義的可能性之一是它可能正常工作。但它可能會在下一次崩潰,或者做一些完全意想不到的事情。

既然你是不是在你的成員函數print使用隱含this說法,好像這樣NULL指針永遠不需要實際上解除引用。

5

取消引用NULL結果爲未定義的行爲(UB)。 UB並不意味着「必須崩潰」或「必須做一些奇怪的事情」。

2

如前所述,是的,這是不確定的行爲,但爲什麼它的工作原理是什麼原因...

這是一個空指針,但定義類型「A」的是,每次你創建類的實例它不會重複這些方法,它只是分配ram並用新分配的地址調用構造方法。

如果你的方法沒有使用任何類內部函數,但你不需要這樣的功能,你應該明顯地使用靜態方法,而不是在編譯器會試圖抱怨訪問「此」或任何班級內部成員。

如果你打破方法,並檢查'​​this'的值,你會發現它是NULL。