1. 程式人生 > >空指標也能呼叫成員函式?

空指標也能呼叫成員函式?

    最近各大公司都在招聘實習生,昨晚,微信公眾號推送了網易的筆試題讓小夥伴們參考,看了第一道題,博主就覺得“嗯,我果然還是見識短哈!”為什麼呢,我們先看看這個程式碼~

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

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

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

博主毫不猶豫的選擇了“執行時崩潰”這個選項

然而。。。。真正的答案卻是這個指標可以正確的呼叫show()函式。。what?!why?!這不科學

懷著對科學嚴謹的態度(我要吐了)B_0061.gif,博主還是去別的大大的部落格轉了一圈。誒!?還真被我找到了,這到底是為什麼呢?

我們現在再看一段程式碼!

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指標。

    這是因為,我們在編寫一個類的時候,它的所有的物件共用了成員函式,所以在編譯期間我們就已經確定了成員函式的地址,而類又依靠this指標來區分各個不同的物件以便於找到正確的資料。對於第一個例子,它的this指標就等於NULL而show()是一個靜態型別的成員函式,在呼叫時不會傳this指標給它,所以我們可以順利的呼叫它,但是第二個例子中我們用到了類的資料a在呼叫時被編譯器解釋為this->a ,但是你得this是NULL啊,你指什麼啊!?

    所以,你明白了嗎。。。

相關推薦

指標呼叫成員函式

    最近各大公司都在招聘實習生,昨晚,微信公眾號推送了網易的筆試題讓小夥伴們參考,看了第一道題,博主就覺得“嗯,我果然還是見識短哈!”為什麼呢,我們先看看這個程式碼~class cal { publ

指標可以訪問成員函式

今天在看多型,這一部分,寫了些驗證程式,發現下面的問題: #include <iostream> using namespace std; class Test{public:    void TestNullPointer()    { cout<<

this 指標的地址--呼叫成員函式的所在物件的起始地址

#include<iostream> using namespace std; class Test { int x; public: Test(int a){ x=a; } void get_this(); }; void Test:: get_this() { co

[C++]的物件指標可以呼叫成員函式

include using namespace std; class A{ public: void func() { cout << "hahaha" << endl; } int m_num = 1; }; int main() { A* ptr = NULL; A obj;

c++中使用指標呼叫成員函式的理解

使用空指標呼叫成員函式會如何? 舉個例子:base是基類,裡面有兩個函式:non-virtual func2 以及 virtual func1; derived是派生類,使用public繼承自base,裡面有四個函式:virtual func1,non-vi

詳解this指標--為什麼的物件指標可以呼叫成員函式

引題 class A{ public: void function() { cout << "I can run" << endl; } }; int main() { A* pa =

指標可以呼叫成員函式

有下面一個簡單類: class A { public: void fun(){ cout << "I'm class A"<<endl; } }; 用一個空指標呼叫上面的fun函式: A* p

指標呼叫成員函式問題

問題由來:new一個自己的類,用完後delete指標,置空NULL 後,打斷點指標為空,但是依舊可以調用出類裡的函式,且編譯通                    過了; 總結:在java,Python語言中是做不到這樣的,但是C++中可以,原因是其繫結方式不一樣;

[C++]類的指標呼叫成員函式後,會發生什麼事?

類的例項呼叫成員函式的原理 其實不管是通過物件例項或指標例項呼叫,其實底層呼叫的過程都是一樣的,都是把當前物件的指標作為一個引數傳遞給被呼叫的成員函式。通過下面的相關例項程式碼進行檢驗: 實驗的C++程式碼 class Student { private: int age; public: Studen

在C/C++中的struct使用函式指標,而且在C++中的struct還使用成員函式

1、函式指標 一般的函式指標可以這麼定義: int(*func)(int,int); 表示一個指向含有兩個int引數並且返回值是int形式的任何一個函式指標. 假如存在這樣的一個函式: int add2(int x,int y) {

C++基礎:類與物件(物件呼叫成員函式 this指標)

1.一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候

c++ 如何把this指標傳入成員函式 像全域性函式一樣呼叫成員函式

測試這個功能的初衷是測試boost裡面的bind boost::bind((&A::sum), &a, _1, _2) 上面的程式碼是我boost bind及多執行緒這篇部落格裡面的一行程式碼。我就想boost是怎麼做到這樣呼叫一個類的成員函式的。其實成員

成員函式指標和其他型別的強制轉換,使用一般指標呼叫成員函式

 成員函式指標和其他型別之間的轉換,參見如下示例: class test...{public:    void t()...{};};typedef   void   (test::*pMemFnction)(); int main()...{    pMemFnction

c++11呼叫成員函式mem_fn和適合普通函式指標

在C++11之前,呼叫一個成員函式指標做為容器的回撥演算法時,可以根據其容器記憶體儲的內容是物件還是指標呼叫相關的mem_fun和_mem_fun_ref函式來與演算法等進行適配,搭配使用。 在c++11中加入mem_fn來對成員函式的呼叫進行相關的封裝,不過也需要對方法

C語言用一級指標實現單鏈表

linklist.h #pragma once #include"stdlib.h" typedef struct LinkNode { //資料域 char* data; //指標域 struct LinkNode* next; }LinkNode,linklist; //初始化 Li

一般函式指標和類的成員函式指標

函式指標是通過指向函式的指標間接呼叫函式。函式指標可以實現對引數型別、引數順序、返回值都相同的函式進行封裝,是多型的一種實現方式。由於類的非靜態成員函式中有一個隱形的this指標,因此,類的成員函式的指標和一般函式的指標的表現形式不一樣。 1、指向一般函式的指標 函式指標的

C++中建構函式呼叫虛擬函式嗎?

      環境:XPSP3 VS2005         今天黑總給應聘者出了一個在C++的建構函式中呼叫虛擬函式的問題,具體的題目要比標題複雜,大體情況可以看如下的程式碼: class Base { public: Base() { Fuction(); }

[Phonegap+Sencha Touch] 移動開發76 讓cordova app訪問遠端網站呼叫cordova外掛功能

我相信,應該會有一些cordova開發者想過實現下面這種app: 使用cordova製作一個外殼app,用於瀏覽服務端部署的網站,這樣當伺服器上網站升級後,這個cordova app可以立即訪問最新版。而不是每次改了一點點功能都要打包上架app。 我最近也在實現這樣

記錄一次生產釋出事件——(簡單的非驗證引發大問題)

歡樂小插曲 ​ 時間定格在週四——常規釋出日下午三點,研發任務早已完成、測試也無大礙。這時,辦公室外走廊裡傳來了一陣急促的報警聲——“此大樓發生緊急情況,請各單位抓緊撤離”。像往常一樣刷刷部落格園,坐等釋出生產的我聞聽此聲,虎軀一震正準備要跑路,轉頭看向周圍的同事。大都很淡定的坐在工位上各自擼碼。於是收回我那

指標成員函式呼叫

我一直認為技術是沒有止境的,不管你怎麼去學,總有你沒有掌握的地方。但是,人,是不能停下腳步的。     今天在檢查一個MFC程式,看到GetSafeHwnd函式,於是讓我想明白到底它比m_hWnd成員變數safe在哪裡?到網上查了一下資料,發現了GetSafeHwnd的