當一個成員函數被調用時,自動向它傳遞一個隱含的參數,該參數是一個指向接 受該函數的調用的對象的指針,在程序中可以使用關鍵字this指針來引用改制鎮,因此稱該指針爲this指針。this指針是c++實現封裝的一種機制, 它將成員和用於操作這些成員的成員函數聯繫在一起。例如;Location類的成員函數init被定義爲:
void Location::init(int initx,int inity)
{
X=initx;
Y=inity;
}
其中對X和Y的引用表示在該成員函數被調用時,引用接受該函數調用的對象中的成員X和Y。例如,對於下面的語句:
Location ALocation;
ALocation.init(5,2);
當調用成員函數init()時,該成員函數的this指針指向對象ALocation。成員函數init中隊X和Y的引用表示是引用對象ALocation的成員X和Y。但成員函數init()如何知道這一點的呢?這由this指針來完成。
c++編譯器所認識的成員函數init()的定義形式爲:
void Location::init(int initx,int inity)
{
this->X=initx;
this->Y=inity;
}
即對於該成員函數中的訪問任何類成員,c++編譯器都認爲是訪問this指針所指向的對象中的成員。由於不同的對象調用成員函數init()時, this指針指向不同的對象,因此,成員函數init()可以爲不同的對象X和Y置初值。使用this指針,保證每個對象可以擁有不同的數據成員,但處理 這些數據成員的代碼可以被所有的對象共享。
this 指針對c++程序員也很有用。下面的程序在Locatin類中增加了一個成員函數assign(),它帶有一個參數,它將函數對象的狀態置給接受該函數調用的對象。
class Location{
private:
int X,Y;
pubic:
void init(int initx,int inity);
void assign (Location& p);
int GetX( );
int GetY( );
};
void Location::assign (Location& p)
{
if (jthis ==&p)
;//使用obj.assign(obj)方式調用時,if語句的表達式this ==&p爲真
else{
X=p.X;
Y=p.Y;
}
}
由於同一個對象之間相互賦值美哦與意義,所以這個函數使用this 指針判斷這種情況。
象本例這樣,當需要在成員函數中檢測接受函數調用的對象時,使用this 指針是恰當的。在本書後面的程序中,由於在成員函數中需要引用接受函數調用的對象,而不是該對象的成員,也經常使用this指針。
注意,在成員函數assign( )的定義中,該成員函數訪問了對象p的私有成員,這在c++中是合法的,因爲assign( )
是在類中說明的一個成員函數。一般而言,只要存在一個對象名或指向對象的指針(及引用),在類中說明的成員函數可以不受限制地訪問該類對象的私有成員。
this指針的類型爲
X *const this;
其中X是一個類名。例如,對於Location類的成員函數而言,this指針的類型爲:
Location *const this;即它的類型爲Location類型的常量指針。