空指針也能調用成員函數?

    最近各大公司都在招聘實習生,昨晚,微信公衆號推送了網易的筆試題讓小夥伴們參考,看了第一道題,博主就以爲「嗯,我果真仍是見識短哈!」爲何呢,咱們先看看這個代碼~
微信

class cal
{
public:
	void show()
	{
		cout << "cal::Show()" << endl;
	}

};
int main()
{
	cal *pcal = NULL;
	pcal->show();
	getchar();
	return 0;
}
#endif

Q;該程序輸出的結果什麼?ide

博主堅決果斷的選擇了「運行時崩潰」這個選項函數

然而。。。。真正的答案倒是這個指針能夠正確的調用show()函數。。what?!why?!這不科學this

懷着對科學嚴謹的態度(我要吐了)B_0061.gif,博主仍是去別的大大的博客轉了一圈。誒!?還真被我找到了,這究竟是爲何呢?spa

咱們如今再看一段代碼!指針

class cal
{
public:
	cal() :a(10)
	{}
	void display()
	{
		cout << a << endl;
	}
private:
	int a;
};
int main()
{
	cal *pcal = NULL;
	pcal->display();
	getchar();
	return 0;
}
#endif

和上面的那段代碼很像吧,可是呢,這段代碼在運行的時候是會崩潰的,爲何呢!?
對象

    仔細的你發現了沒,上面第一段代碼裏,指針調用的函數沒有用到this指針,而這一段裏用到了,因此關鍵就在於你是否用到了this指針。get

    這是由於,咱們在編寫一個類的時候,它的全部的對象共用了成員函數,因此在編譯期間咱們就已經肯定了成員函數的地址,而類又依靠this指針來區分各個不一樣的對象以便於找到正確的數據。對於第一個例子,它的this指針就等於NULL而show()是一個靜態類型的成員函數,在調用時不會傳this指針給它,因此咱們能夠順利的調用它,可是第二個例子中咱們用到了類的數據a在調用時被編譯器解釋爲this->a ,可是你得this是NULL啊,你指什麼啊!?編譯器

    因此,你明白了嗎。。。
博客

相關文章
相關標籤/搜索