它实际上是类定义中一个缺省的预定义的指针。当调用一个成员函数时,系统保证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 指针是非常重要的,它在某些类型的链表管理中往往也是必要的
----------------------------------------------------------------------------------------------------------
this在成员函数的开始前构造,在成员的结束后清除。
这个生命周期同任何一个函数的参数是一样的,没有任何区别。
因为,成员函数默认第一个参数就是this。
举例:
class A{
public:
int func(int p){}
};
func的原型在编译器看来,应该是
int func(A* const this, int p);
即开始执行成员函数之前,构造。
成员函数执行结束,清除。
如果class或者struct里没有成员函数,this是没有构造函数的。只能当作C的STRUCT使用
当调用一个成员函数时,系统保证this 指针始终指向产生这个调用的对象,并将该指针作为一个变元自动传递给该函数。同时,只有对象和成员函数之间才存在 this 指针。
VC
里的this指针在成员函数调用的时候,是保存在ecx寄存器里的,函数调用时mov指针内容到寄存器,而不是将其作为某个参数压栈。另外,由于成员函数
需要一个隐藏的this指针参数,而且调用的压栈方式不符合回调函数的约定,所以不能用来作回调函数。类内的static函数可以用作回调,因为它不能访
问非static成员变量。