有下面的乙個簡單的類:
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 我們執行的時候,很顯然報...