this是指向当前对象的指针
对象在调用成员函数的时候,会自动传入当前对象的内存地址
struct Person {
int m_id;
int m_age;
int m_height;
void display(){
cout << "m_id is" << this->m_id << endl;
cout << "m_age is" << this->m_age << endl;
cout << "m_height is" << this->m_height << endl
// 编译器默认每一个成员函数里面都有一个this,this就是指向person对象的指针,this里面存储的就是person对象的地址值.this = &person,编译器允许省略this->完整的写法是this->m_id
}
}
// 函数代码在内存中只有一份,函数是放在代码区,而对象是放在栈区,也就是现在调用display()函数的时候,就会出现要代码区调用栈区,在这里只要将person对象的地址值传给display()函数就可以
int main(){
Person person;
person.m_id = 4;
person.m_age = 5;
person.m_height = 6;
person.display();
// 首先调用display()函数,就会到代码区寻找display()这个函数,找到这个函数的时候,顺便会将调用这个函数的对象person的地址值传给this,所以this指向person,指向打印的时候,就是拿到person的m_id,m_age,m_height.
所以函数和对象在内存上的没有关系,是相互独立的,函数是放在代码区的,代码区的函数访问栈空间的地址值,是通过函数把栈空间的地址值传给代码区,通过地址值得到栈里面对象的成员变量
}
指针访问对象成员的本质
int main(){
//创建对象
Person person;
person.m_id = 10;
person.m_age = 20;
person.m_height = 30;
// 创建指针
Person *pPerson = (Person *)&person.m_age;
pPerson->m_id = 40;
pPerson->m_age = 50;
// eax里面放的是m_age的值.考验代码的本质
mov eax, dword ptr [pPerson]
mov dword ptr [eax], 40
mov dword ptr [eax+4], 50
// 取出pPerson中存储的地址值,编译器认为这里面存储的是person的地址值,m_id在person对象中排前面,所以编译器会认为m_id的地址值就是person的地址值.访问age的时候发现age在person中排第二位,要跳过4个字节才能访问m_age
// 指针pPerson存储的地址值不再是person的地址值,而是person.m_age的地址值
// 打印
person.display();
// 打印结果是10,40,50
}
this是指向当前对象的指针
最新推荐文章于 2022-09-25 16:15:10 发布