空指標呼叫類的方法

2021-07-05 03:25:41 字數 1171 閱讀 8993

有下面的乙個簡單的類:

class

cnullpointcall

;int

cnullpointcall::m_istatic =0

;void

cnullpointcall::test1()

void

cnullpointcall::test2()

void

cnullpointcall::test3(

intitest)

void

cnullpointcall::test4()

那麼下面的**都正確嗎?都會輸出什麼?

cnullpointcall 

*pnull 

=null; 

//沒錯,就是給指標賦值為空

pnull

->

test1();

//call 1

pnull

->

test2(); 

//call 2

pnull

->

test3(

13); 

//call 3

pnull

->

test4(); /

/call 4

你肯定會很奇怪我為什麼這麼問。乙個值為null的指標怎麼可以用來呼叫類的成員函式呢?!可是實事卻很讓人吃驚:除了call 4那行**以外,其餘3個類成員函式的呼叫都是成功的,都能正確的輸出結果,而且包含這3行**的程式能非常好的執行。

經過細心的比較就可以發現,call 4那行**跟其他3行**的本質區別:類cnullpointcall的成員函式中用到了this指標。

對於類成員函式而言,並不是乙個物件對應乙個單獨的成員函式體,而是此類的所有物件共用這個成員函式體。 當程式被編譯之後,此成員函式位址即已確定。而成員函式之所以能把屬於此類的各個物件的資料區別開, 就是靠這個this指標。函式體內所有對類資料成員的訪問, 都會被轉化為this->資料成員的方式。

而乙個物件的this指標並不是物件本身的一部分,不會影響sizeof(「物件」)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過this進行。

空指標的成員函式呼叫

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

空指標的成員函式呼叫

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

C 空指標呼叫函式

在c 中是允許空指標呼叫函式的,但是在我們使用空指標呼叫成員函式的時候,一定要注意有沒有用到this指標如果用到了this指標要加以判斷以保證程式的健壯性。例如以下程式 class person void getfd int fd 0 void test01 intmain 我們執行的時候,很顯然報...