問題:當在物件的外部訪問該物件的公有成員時,必須指明是哪乙個物件。但是當我們用物件的成員函式來訪問本物件的成員時,在成員函式中只要給出成員名就可以實現對該物件成員的訪問。再進一步可用同乙個類建立很多個物件,但它們共用同乙份成員函式的拷貝。既然是同乙份拷貝,那麼成員函式又怎麼知道是取哪乙個物件的成員資料呢?
其實,當呼叫乙個成員函式時,系統自動產生乙個隱藏的指標,這個指標稱為this指標,始終指向產生這個呼叫的物件,並將該指標作為乙個引數自動傳遞給該成員函式。這就是說,成員操作符總是要使用的,只是在物件內是隱式的,而在物件外是顯式的。即在物件內省略了this指標。
實際上編譯器是這樣實現this指標的:
1.改變類成員函式的定義,用附加引數this指標來定義每個成員函式。如:
void cgoods::registergoods(cgoods*this,char*nam,
int amount,float price)
2.每個類成員函式的呼叫,加上乙個附加的實參——被呼叫物件的位址。如:
car1.registergoods ( string , number , pr );
改變為:
registergoods ( &car1 , string , number , pr);
在上例中,this指標不必寫成顯式的,但是有時必須寫成顯式的,如在以後要學的某些型別的鍊錶管理中,在需要返回當前呼叫的物件時(對複數類的賦值號過載中 ),等等。但必須指出靜態成員函式沒有this指標。因為普通成員函式雖然在物理上只有乙份拷貝,但在邏輯上都認為乙個物件有乙份拷貝,所以有this指標,而靜態成員函式在邏輯上也只有乙份拷貝,不屬於具體的物件,當然沒有this指標。
C 基礎(10)this 指標
this指標的用途 1 通過this指標可以訪問當前物件的資料成員 c 為類的每個成員函式都提供了乙個隱含的名字為this的指標引數 類名 const this 在成員函式中,隱含了對this指標的使用。例如,成員函式printinfo的定義被編譯系統處理為 void cpoint printinf...
C 指標的學習
include head.c void main end switch end for end main void arrayref end for printf 1 output n for n 0 n 10 n end for printf n end arrayref void fingera...
C 學習(10) 物件模型和this指標
在c 中,類內的成員變數和成員函式分開儲存 只有非靜態成員變數才屬於類的物件上 include includeusing namespace std 成員變數和成員函式是分開儲存的 class person 非靜態成員函式,不屬於類的物件上 static void func 靜態成員函式,不屬於類的...