这两天我发现,带着问题更能清楚的了解一个东西,问题越细越多,就会了解的很透彻,根本不需要记忆,现在想想摆脱了死记硬背有多舒服
问题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,可写可不写,你也可以自己加上,例如
vcrHxtXNqLX308OjrM7S1rvE3LDRdGhpc7Srtb3P37PMu9i197qvyv3A78PmwLTKudPDs8nUsbqvyv08L3A+CjxwPr3ivvY2o7q94s72wb23+bvjseDNvKOsx7DM4aOsZnVuKCm6zWG2vMrHRktPbmW1xLPJ1LE8L3A+CjxwPjxpbWcgc3JjPQ=="https://www.cppentry.com/upload_files/article/49/1_wfkhe__.png" alt="\">
图一,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原创,如有建议,轻留言)