this 可以直接访问一个隐藏的指针,这个指针就称为 this 指针。它实际上是类定义中一个缺省的预定义的指针。当调用一个成员函数时,系统保证this 指针始终指向产生这个调用的对象,并将该指针作为一个变元自动传递给该函数。同时,只有对象和成员函数之间才存在 this 指针。
【示例】下面一段程序创建一个叫做power的类来计算一个数的幂:
power
{
private:
double b, val;
int e;
public:
power(double base, int exp);
double get_power() { return val;}
};
power::power(double base int exp)
{
b = base;
e = exp;
val = 1;
if(exp == 0)
return;
for(; exp > 0; exp--)
val = val * b;}
void main()
{
power x(4.0, 2), y(2.5, 1), z(5.7, 0);
cout << x.get_power() <<"";
cout << y.get_power() <<"";
cout << z.get_power() <<"/n";
}
在一个类的成员函数内部(如power()),可以直接引用一个类的数据成员,而无需用任何对象或类的限制性说明。所以在 power 类的构造函数 power() 里语句b = base; 意味着参数 base 的值将被赋予产生这个调用的对象中的数据成员 b。在程序中分别定义了 power 的三个对象 x、y 和z,编译器将对象的成员函数与同一对象的数据成员在调用时联系在一起,为此编译器实际上给成员函数传递了一个隐藏的指向函数调用所要引用的对象的指针,即 this 指针。相同的语句可以改写如下:
this->b = base;
这表明,当发生函数调用时(例如当新建一个 power 类的对象x时),编译器传给构造函数 power() 一个指向对象 x 的 this 指针,并隐式地使用这个指针访问属于对象x的b的拷贝。其实上述 power() 函数中的 b=base 等语句只是简写形式,下面是用 this 指针改写的完整的 power()函数:
power::power(double base , int exp)
{
this->b = base;
this->e = exp;
this->val = 1;
if(exp == 0) return;
for(; exp>0; exp--)
this->val = this->val*this->b;
}
在这个例子中,数据成员的名字前缀表达式 this-> 是合法的但没有什么效果,因为this 指针的使用本来就是隐式的。友元函数不是类的成员,而且没有this指针,静态成员函数也没有 this 指针。但在另一些情况下,必须用 this 指针明确当前调用的对象,如在重载运算符时,可以看到 this 指针是非常重要的,它在某些类型的链表管理中往往也是必要的