C 空指標呼叫成員函式

2021-09-26 02:23:26 字數 1668 閱讀 6101

如果在c++裡用空指標呼叫成員函式會發生什麼情況呢?

以下面類為例

class a

void geta()

void seta(int x)

virtual void test()

};

首先我們用空指標p去呼叫成員方法show;

發現是可以成功呼叫的

呼叫geta(),發現程式可以編譯成功,但執行失敗,並返回了乙個錯誤碼

繼續嘗試呼叫seta函式嘗試修改a的值,與呼叫geta,一樣執行失敗,返回了乙個錯誤碼

這下我們呼叫虛函式,看能不能成功呼叫

結果也是一樣的無法呼叫,並返回錯誤碼。

為什麼會空指標,有時可以呼叫成功成員函式,為啥有時卻不行呢?

其實成員函式可以看成是乙個普通函式。

例如:平時自己寫的成員方法是這樣的

void seta(int x)

但在編譯器的眼裡 他是這樣的

void seta(a*this,int x)

自己使用成員函式的時候是這樣寫

a a;

a.seta(10);

但是對於編譯器來說,他其實是這樣的

a a;

seta(&a,10);

那為什麼show函式可以呼叫,而其他呼叫卻失敗呢?

通過上述實驗我們發現

分析一下原因

類的成員函式並不與具體物件繫結,所有的物件共用同乙份成員函式體,當程式被編譯後,成員函式的位址即已確定,這份共有的成員函式體之所以能夠把不同物件的資料區分開來,靠的是隱式傳遞給成員函式的this指標,成員函式中對成員變數的訪問都是轉化成"this->資料成員"的方式。因此,從這一角度說,成員函式與普通函式一樣,只是多了乙個隱式引數,即指向物件的this指標。而類的靜態成員函式只能訪問靜態成員變數,不能訪問非靜態成員變數,所以靜態成員函式不需要指向物件的this指標作為隱式引數。

因此就可以顯而易見的知道原因了

show沒有訪問成員變數,所以沒有使用隱式傳遞的this指標,所以指標為null,對程式沒有印象

而geta,訪問了非靜態成員變數,使用了this指標,這個是時候相當於this->a,this為null,是非法的操作,所以呼叫失敗

最後的虛函式為什麼也會呼叫失敗呢?他並沒有訪問非靜態成員變數啊?

那是因為虛函式的函式體內,在編譯階段會生成乙個指向虛表的指標vfptr,在呼叫虛函式時,虛表指標也是通過this來傳遞的,所以也會失敗。

C 空指標呼叫成員函式

空指標訪問成員函式 1.如果 成員函式中沒有用到this 則可以直接使用 2.如果成員函式中使用了this,則會出錯,所以我們要在成員函式中新增空指標判斷 define crt secure no warnings includeusing namespace std 如果用空指標訪問成員函式 1....

空指標的成員函式呼叫

自 http hi.baidu.com sangwf blog item 0be10af482d0c46edcc47464.html 我一直認為技術是沒有止境的,不管你怎麼去學,總有你沒有掌握的地方。但是,人,是不能停下腳步的。今天在檢查乙個mfc程式,看到getsafehwnd函式,於是讓我想明白...

空指標的成員函式呼叫

指標為null了,函式還能呼叫嗎?於是寫了乙個簡單的程式來做測試,如下 class a 測試發現,程式能夠正常執行。把p賦乙個非空值如p a 123 同樣如此。於是想搞明白這到底是怎麼一回事。雖然以前明白類成員函式中其實是隱藏了乙個this指標,但不同的例項在呼叫函式時是如何工作的,還不是很清楚。通...