目录
一.this指针的引出
1.为什么要有this指针?
在上面的代码中可以看出,我们用Date类,实例化两个对象分别是d1,d2。成员函数是放在公共代码区中的,对象调用函数不会解引用去对象中找,那么在d1调用DateInit和Print时,如何确保让编译器知道是d1调用的,而不是d2呢?
答案就是:C++中,通过引入this指针,来解决此类问题
2.什么是this指针?
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成
可以看到this指针在两个对象调用函数时,是两个不同的地址。
通过打印的结果可以看到,this指针与对象地址相同,由此我们可以讨论一下this指针的底层实现
二.this指针的实质
this指针的类型:类的类型* const this
1.this指针只能在成员内部使用
2.this指针不能改变指向
3.this指针本质上是一个成员函数的形参,是在对象调用成员函数时,将自身地址传递给形参(也就是this指针),所以对象中不会存储this指针
4.this指针是成员函数第一个隐藏的指针形参,一般情况有编译器ecx寄存器自动传递,不需要用户手动操作
三.this指针面试题
1.this指针存在哪里??
答:this指针是成员函数的一个形参,只要是形参,就是实参的临时拷贝,在对象调用成员函数时,会建立函数栈帧,此时将实参也就是对象地址传递给形参发生临时拷贝,形参也就是this指针会建立在栈区,等函数结束时,函数栈帧会被销毁,同时形参也会被销毁。
2.this指针可以为空吗??
答:this指针可以为空,可以直接将一个空指针传递给成员函数。
3.说一下Print1和Print2有没有问题,哪里错了,为什么错??
class Date
{
public:
void Print1()
{
cout << "hello this" << endl;
}
void Print2()
{
cout << _day << endl;
}
private:
int _year = 1;
int _month = 1;
int _day = 1;
};
int main()
{
Date* p = nullptr;
p->Print1();
p->Print2();
return 0;
}
答:首先p是一个空指针,Print1和Print2这两个成员函数都是通过这个空指针调用的,在指针对象p调用成员函数时,因为p本身就是指针,所以会把p传递给this指针,此时this为nullptr,Print1函数没有对this有解引用操作不会报错,而Print2中打印_day,实际则是this->_day,对空指针解引用,程序崩溃