在C++中,this是一个关键字,同时,它也是一个指针,C++编译器给每个非静态的成员函数(无static关键字修饰的函数)增加了一个隐藏的指针参数(this),让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
代码实现:
#include
using namespace std;
class Date {
public:
void InitDate(int year, int month, int day)
{
//打印this指针,可以发现this指针的值和调用这个函数对象的地址是一样的
cout <<"this = " << this << endl;
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << this->_year << "/" << this->_month << "/" << this->_day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
cout << "&d1 = " << &d1 << endl;
d1.InitDate(2022, 11, 20);
d1.Print();
Date d2;
cout << "&d2 = " << &d2 << endl;
d2.InitDate(2021, 10, 10);
d2.Print();
return 0;
}
通过上述例子,我们可以看出,this是实际上是成员函数的一个形参(即编译器将上述例子中的成员函数Ivoid InitDate(int year, int month, int day)解析为void InitDate(Date* const this, int year, int month, int day)),对象在调用成员函数的时候,将对象的地址传递给this(d1.InitDate(2022,11,20)就是将d1的地址传递给this指针)但是C++中不需要我们自己手动添加这个指针,在编译阶段,编译器默认将程序解析,将this指针添加到形参中。
1.this指针的类型为 类的类型 *const (Date* const),表明指针this的指向位置不能改变
2.this指针只能在成员函数内部使用,不能在static静态函数中使用
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。 所以对象中不存储this指针。
4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用 户传递
两个问题:
(1)this指针存在哪里?
对于这个问题,我们可以通过编译器来进行验证
我们可以看出指针this存储在栈上
(2)this指针可不可以为空?
答案:不一定,可以通过以下例子来说明
以上例子,我们定义了一个指向对象a的指针p,通过指针p来访问成员函数Print(),这显然是没有问题的,但是如果将p的值变为空结果会怎么样呢?
我们发现程序仍然可以执行,这就说明指针this的值可以为NULL,因为在执行p->Print()这条语句的时候,编译器将p的值传递给指针this,此时this的值为NULL,所以打印出0000 0000
但如果我们继续在Ptint()中打印成员变量_a的值,我们会发现程序出错