this是指向当前对象的指针

 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
   }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值