我在不同的平臺上使用G ++(4.5.2)時遇到了一個非常奇怪的行爲;這裏的代碼:爲什麼在C++中發生這種情況?
class Class
{
private:
std::string rString;
public:
Class()
{
this->rString = "random string";
std::cout << "Constructor of Class" << std::endl;
}
virtual ~Class()
{
std::cout << "Destructor of Class" << std::endl;
}
void say() const
{
std::cout << "Just saying ..." << std::endl;
if (this == NULL)
std::cout << "Man that's really bad" << std::endl;
}
void hello() const
{
std::cout << "Hello " << this->rString << std::endl;
}
};
int main()
{
Class *c = NULL;
/* Dereferencing a NULL pointer results
in a successful call to the non-static method say()
without constructing Class */
(*c).say(); // or c->say()
/* Dereferencing a NULL pointer and accessing a random
memory area results in a successful call to say()
as well */
c[42000].say();
/* Dereferencing a NULL pointer and accessing a
method which needs explicit construction of Class
results in a Segmentation fault */
c->hello();
return (0);
}
問題是,爲什麼主函數中的兩個第一條語句不會崩潰程序?這是未定義的行爲,還是編譯器僅僅調用Class :: say()就好像它是靜態的,因爲它不會在方法內部取消引用「this」指針?
你的編輯是完全沒有必要的,而且很不恰當:'inline'在這裏沒有效果,因爲在類中定義的函數會自動'inline'。 –
你錯了,編譯器可能或不可能在他將生成的二進制文件中「嵌入」這些方法。僅僅因爲這些方法是在類「Class」中定義和實現的,並不意味着它們實際上會被內聯。此外,使用'inline'關鍵字預設我的原型並不意味着此代碼將由編譯器內聯。我只是給編譯器一個提示,說爲這些方法生成序言可能會很重。 –
不,你*錯了。你拿起了一些基本上是正確的,但不完全的半信息。 [在類中定義的成員函數(與剛剛聲明的相反)自動爲'inline'](http://msdn.microsoft.com/en-us/library/bw1hbe6y(v = vs80).aspx) (該標準的§7.1.2/ 3)。請注意,'inline'的作用不僅僅是建議編譯器執行調用內聯。 §7.1.2有更多細節。 –