C++:this指针
class date
{
public:void f(int i){}
}
以上是我们定义的一个简单的类,这个类里面含有一个简单的成员函数,成员函数看似只有一个参数,实际上是两个参数,除了参数i以外,还有一个指向调用该函数的对象的指针——this指针。
在实际上,编译器会把这段代码改造成这样:
class date
{
public:void f(date*this,int i){}
}
其他面向对象的语言也会这样做,不过可能不是指针,而是引用。
那么我们实际调用的时候是怎么样的呢?
date i;
i.f(9);
这一段代码,在经过编译器的解释之后,就会变成这样:
date i;
i.f(&i,9);
会把对象的地址一起传过去,这样才会方便成员函数调用对象里面的成员。
不过需要注意的是,我们在定义成员函数时,写有哪些参数的时候不能自己来写这个this指针,
//这是错误写法
void f(date*this,...)
{
}
不过我们可以在函数内部显示地调用
class date
{
public:void f(int i){this->成员...}
}
不过调用对象的成员时,你自己不显式地调用,编译器会帮你补充的,所以以上的代码等于:
class date
{
public:void f(int i){成员...}
}
this指针严格来说是这样写的:
class date
{
public:void f(date*const this,int i){this->成员...}
}
这里的const修饰的是指针本身,而不是指针指向的内容。
this其实是一个关键字,this指针其实是一个形参,一般存储在栈帧里面,不过vs底下是用ecx寄存器传递的。