目录
一、this指针是什么、
class Date
{
public:
Date(int year=1,int month =1,int day=1)
{
this->_year = year;
this->_month = month;
this->_day = day;
}
void print()
{
cout << this->_year << " " << this->_month << " " << this->_day << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
int main()
{
Date d1;
Date d2;
d1.print();
d2.print();
return 0;
}
对于上面这个日期类中的print成员函数,不同对象d1或d2调用,那么可以使用this指针来访问到该对象的私有的成员属性。方便理解我们可以写成下面的形式,相当于在print中我们传入对象的地址,来说明执行的是哪一个对象的函数。但实际上编译器不允许我们这么写。
void print(/*Date* this*/)
d1.print(/*&d1*/);
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
二、this指针的特性
1. this指针的类型:类类型* const,入上述的this指针类型为Date* const,指针指向的位置不能改变。
2. 只能在“成员函数”的内部使用。
3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。this指针作为形参的话,存放位置一般在栈上,有的编译器为了提高效率会使用寄存器来存储this指针。
4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
5.this指针可以为空,只要不解引用。
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
void Show()
{
cout<<"Show()"<<endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
p->Show();
}
将A类中的指针设为空指针后,我们调用PrintA函数会出错,应为函数中使用到了成员属性_a
其中隐含了this指针的解引用,相当于this->_a,将空指针解引用就会出错。而调用Show函数就不会有这样的问题,也是因为其没有对this指针解引用。