2013-11-27 54 views
2

在下面的程序中。爲什麼函數在沒有C++對象的情況下被訪問?

#include<iostream> 

using namespace std; 


class Base{ 


public: 
    Base(){ 
    cout<<"I am Constructor"<<endl; 
    } 
    void method(); 


}; 

void Base::method(){ 
cout<<"I am method"<<endl; 
} 

int main() 
{ 

    Base *sc1; 
    Base *sc2; 
    sc1->method(); 
    sc2->method(); 


} 

我得到的輸出如下

 
I am method 
I am method 

這怎麼能發生,因爲沒有創建對象?

回答

2

這是未定義的行爲,但它不會崩潰,因爲您沒有訪問該類中的任何成員變量,因此即使指針sc1/sc2是隨機值也沒有任何事情發生。

5

它是未定義的行爲,所以「任何事情」都可能發生。它可能會運行,因爲您不通過this指針訪問任何內容(隱式或顯式地)。

這將是更有可能失敗:

struct Foo 
{ 
    int foo() const { return i; } 
    int i; 
}; 

int main() 
{ 
    Foo* f; 
    f->foo(); 
} 
+0

我喜歡你提到它可能「有效」,因爲沒有成員數據被訪問。在編輯你的作品之前即將寫下一個例子。我已經投了你的答案,所以你將不得不想像我的獎勵點! :) – Dennis

3

因爲你有沒有對象的代碼有未定義行爲。未定義的行爲意味着它的意思,它並不意味着你的程序會崩潰,這意味着任何事情都可能發生,包括訪問一個不存在的對象。

使編程C++困難的一件事是,你不能依靠錯誤的程序崩潰,有時他們似乎工作。

相關問題