C++中的this指针
一、引入this指针
我们先定义一个简单的学生类,学生类中有两个成员函数,分别是设置学号setNo(int no)
和查看学号displayNo()
。
class Student{
public:
void displayNo(){
cout << "该学生的学号是:" << _no << endl;
}
void setNo(int no){
_no = no;
}
private:
int _no;//学号
};
int main(){
Student s1,s2;//创建了两个学生对象
s1.setNo(1);
s2.setNo(2);
s1.displayNo();
s2.displayNo();
return 0;
}
运行结果如下:
所以student类中的两个简单的成员函数在其函数体内部都没有对关于不同对象进行区分操作,那么当s1,s2分别调用setNo和displayNo的时候,这两个函数是怎么确保设置的对象是匹配正确的呢?
在C++中,通过引入this指针来解决这个问题,C++编译器给每个非静态成员函数增加了一个隐藏的this指针形参,让该指针指向当前调用这个成员函数的对象,在函数体内所有成员变量的修改都通过该指针来进行操作,对用户是完全透明的,所以用户不用自己手动去传入这个this指针。
二、this指针的特性
- this指针的类型是:类类型 * const,类类型即当前this指针所作用的类,它的类型,拿我们上面例子来说,this指针的类型就是
Student* const
- 这个this指针的作用于仅限于成员函数内部
- this指针在本质上是成员函数的一个形参,在对象调用成员函数时,将发起函数调用的对象的地址作为实参,传递给this指针,这样也说明this指针并非对象的一部分,所以它并不影响对象
sizeof()
的结果。 - this指针是类对象中非静态成员函数的第一个隐含的指针形参,一般情况下会由编译器通过ecx寄存器自动传递,不需要用户自己来传递
所以在当s1在调用setNo(int no)
时,编译器会先s1对象的地址传递给setNO函数,这样就可以确保在函数体内部给对象的成员变量_no赋值时,是作用在s1对象,而非s2。