当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向接 受该函数的调用的对象的指针,在程序中可以使用关键字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类型的常量指针。