C 中使用空物件指標呼叫成員函式

2021-07-10 03:02:46 字數 1443 閱讀 5762

c++中,空指標是不能夠使用的,然後空物件指標有時候卻能夠呼叫成員函式。

下面定義乙個簡單的類: ?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

classtestcls

;

intmain()

空指針對test_fun1和 test_fun2的呼叫正常,對test_fun3和test_fun4的呼叫會出錯。下面具體 分析

一下原因:

類的成員函式並不與具體物件繫結,所有的物件共用同乙份成員函式體,當程式被編譯後,成員

函式的位址即已確定,這份共有的成員函式體之所以能夠把不同物件的資料區分開來,靠的是隱式傳

遞給成員函式

的this指標,成員函式中對成員變數的訪問都是轉化成"this->資料成員"的方式。因此,

從這一角度說,成員

函式與普通函式一樣,只是多了乙個隱式引數,即指向物件的this指標。而類的

靜態成員函式只能訪問靜態成

員變數,不能訪問非靜態成員變數,所以靜態成員函式不需要指向物件

的this指標作為隱式引數。

有了上面的分析,就可以解釋為什麼空物件指針對test_fun1, test_fun2的呼叫成功,對test_fun3 的

呼叫不成功:

test_fun1是靜態成員函式,不需要this指標,所以即使ptestcls是空指標,也不影響對test_fun1 的

正常呼叫。

test_fun2雖然需要傳遞隱式指標,但是函式體中並沒有使用到這個隱式指標,也就是說沒有通過 這個

隱式指標去使用非靜態的成員變數,所以ptestcls為空也不影響對test_fun2的正常呼叫。

test_fun3就不一樣了,因為函式中使用到了非靜態的成員變數,對num的呼叫被轉化成

this->num,

也就是ptestcls->num,而ptestcls是空指標,因此ptestcls->num非法,對

test_fun3的呼叫出錯。

test_fun4中並沒有使用非靜態成員變數,為什麼呼叫也會出錯呢,原因在於test_fun4是虛函式, 有

虛函式的類會有乙個成員變數,即虛表指標,當呼叫虛函式時,會使用虛表指標,對虛表指標的使用

也是通過隱式指標使用的,因此對test_fun4的呼叫也就會出錯了。

C 空指標呼叫成員函式

如果在c 裡用空指標呼叫成員函式會發生什麼情況呢?以下面類為例 class a void geta void seta int x virtual void test 首先我們用空指標p去呼叫成員方法show 發現是可以成功呼叫的 呼叫geta 發現程式可以編譯成功,但執行失敗,並返回了乙個錯誤碼 ...

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函式,於是讓我想明白...