这两天我发现,带着问题更能清楚的了解一个东西,问题越细越多,就会了解的很透彻,根本不需要记忆,现在想想摆脱了死记硬背有多舒服
问题1:this指针指针是什么?
问题2:为什么这个指针叫this?
问题3:this指针指针是干嘛的?
问题4:this指针有没有空间?如果有,在哪里?
问题5:this指针是在哪里用的?
问题6:this指针的实现机制是什么?
遗留1:暂时先当做是叫做this的一个指针(需要下面的问题铺垫才能知道)
遗留2:(需要下面的问题铺垫才能知道)
解决3:类里的成员变量或者是成员函数的调用方式是this调用,意思是用本类的对象调用,this指针相当于是本类的对象
解决4:指针是有空间的,更何况我在解决3里说this就是本类对象(解决3说的是相当于,你这里说的是“就是”,冲突啊),对象是类的实例化,怎么会没空间,空间再哪--------------呢?new出来的对象,this的空间再堆上,直接建的对象,this的空间在栈上
解决5:this是本类的对象,在类里面出没,在类里面使用成员变量或者成员函数,可以直接用,前面略写了一个this,可写可不写,你也可以自己加上,例如但有的情况下是必须写的,例如楼主这两天一直在干的事就是封装线程,扩展功能,想要在线程的回调函数里面用成员函数,无奈线程回调函数的调用方式是普通调用,我只能把this传到线程回调函数里面来使用成员函数
解决6:解析两幅汇编图,前提,fun()和a都是FKOne的成员
图一,01351047看到了this,图二是在反汇编里取消了显示符号名,可以看得到出this是ebp-4
1.建了这个类的对象,开辟空间,esp的位置就是对象地址的末尾,这个类有一个成员变量,那这样esp的位置是这个成员变量的后面,也就是这个对象首地址+4个字节后面
2.01351041把esp的值给ebp
3.ebp-4就是这个类的对象的首地址,说明了所谓的this就是对象的首地址,也说明了调成员变量或函数都是通过对象首地址(这里可以看得出this的功能和是个什么,继续深入)
4.我说this是假的,根本没有这个this指针,我在汇编上看不到指针这个东西,看到的就是ebp-4而已------------没有this这个东西
5.我说this是真的,指针的存在就是保存的东西以地址来解释,ebp-4不就是对象的地址,01351047可以看得出把对象的首地址放到eax寄存器中,那这个时候eax里面是对象的首地址,eax不是就是一个指针(这里说到了this的实现机制,就是把对象的地址放在寄存器里,然后使用寄存器来找成员函数或者成员变量,根本没有this这个东西,但我5里也说有这个东西,看到这,不知道你有没有看明白,我这篇文章标题的意思,这里也解决了遗留的1和遗留的2,遗留2,this英文解释就是这个类里才能使用,也解决了我上面为什么说相当于)--------有this这个东西
(PanPen120原创,如有建议,轻留言)