2012-10-18 37 views
4

可能重複:
What will happen when I call a member function on a NULL object pointer?這個C++代碼是如何工作的?未初始化的指針

class A { 
    public: 
    void foo() { cout << "Work";} 
    void bar() { this->foo(); }//new edit, works too! 
}; 

class B { 
    private: 
    A *a; //never initialized 
    public: 
    A& getA() { 
     return *a; 
    } 
}; 

void SomeFunction() { 
    B *b = new B(); 
    B& bRef = *b; 
    bRef.getA().bar();//edited 
    delete b; 
} 

我叫SomeFunction()沒有初始化 「一」,它仍然打印 「工作」 正常。我不明白爲什麼,它應該用分段錯誤來解決問題!

+7

這是未定義行爲的美(閱讀:可怕部分) –

+0

我發佈了這個問題的答案。然後注意到它的錯誤!然而當我運行這個程序時,它打印出正確的答案。擋了我發佈了一個問題。 –

回答

5

記得類只是C++的一個構造。編譯時,所有類方法都只是靜態方法,它們接受隱藏的this參數。

鑑於您的foo()方法從未引用任何數據成員,因此永遠不需要使用它,因此儘管沒有初始化值,仍可以正常運行。

+0

教育。但可怕的無所謂。 –

+1

在三個答案中,我選擇了你的,因爲你明確提到foo()仍然接受「this」指針。我的代碼編輯證明它的確如此。不像Henrik的ansswer,他說「它的工作原理是因爲它不是虛擬的,它不使用這個指針」 –

+0

-1這個答案沒有提到最重要的一點,就是根據語言規範,這個代碼的行爲未定義,因此可能因編譯器而異。 –

10

這是未定義的行爲,但它可以在大多數編譯器上工作,因爲foo不是virtual而且它不使用this指針。

+0

使用「這個」,它仍然工作! –

+1

@PrototypeStark - 不,你不使用這個。它不需要調用foo。因此,它也不需要打電話給酒吧。 – Henrik

+0

@PrototypeStark查看我的答案,爲什麼不使用'this'。 –

3

語義,

o.f(args) 

相同

f(o, args) 

所以,你可以考慮一下你調用的函數(A::foo())等同於:

void A_foo(A* pthis) 
{ 
    cout << "Work"; 
} 

正如你可以看到,pthis永遠不會被解除引用,所以不會發生無效的內存訪問。即使您鍵入this->foo(),它也是完全相同的調用,並且this不需要解除引用。

至少,這是編譯器實現它的一種常見方式。對於可能發生的情況,它沒有定義,所以在Death Station 9000上運行代碼可能會讓小貓進入空間。想想小貓!