this指针
this指针的介绍
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。–百度
this指针的特点
- this指针的作用?
在c中我们实现一个栈时,需要我们自己传递栈的地址参数,这种操作涉及到大量指针地址的操作;为了简化操作在c++中我们实现栈时,编译器通过this指针隐式的自行传递对象的地址参数,所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
d1.Init(1, 2, 3);//调用非静态成员函数时,this指针将对象d1的地址作
//为函数的实参“隐式”传递给非静态成员函数的实参
Date d2;
d2.Init(1, 2, 0);
return 0;
}
- this指针的类型?
this指针的类型是* const ,指针的指向不能被改变,即成员函数中不能给this指针赋值, - this存储在哪里?
this指针一般被存储在栈(因为this一般隐式的作为第一个形参)中,
在vs2022中, 由下图汇编代码可见编译器将参数从右往左压栈,d1对象的地址被放在rcx寄存器中。
this指针的其他注意事项
- this指针只能在“成员函数”的内部使用
- this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
一个代码例子
class Date
{
public:
void print()
{
cout<< "show()"<< endl;
}
private:
int _day;
};
int main()
{
Date * p = nullptr;
p->print();
return 0;
}//运行崩溃
class Date
{
public:
void print()
{
cout<< _day << endl;
}
private:
int _day;
};
int main()
{
Date * p = nullptr;
p->print();
return 0;
}//正常运行
代码1不可以正常运行,因为成员变量存储在对象中,访问成员变量会将p作为实参传递给this指针,在遇到空指针时程序运行崩溃。
而代码2可以正常运行,因为所有类的成员函数放在代码区,不需要访问对象。
注意:所有类成员函数放在代码区;为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区;余下的空间都被称为堆区。