這兩天我發現,帶著問題更能清楚的了解一個東西,問題越細越多,就會了解的很透徹,根本不需要記憶,現在想想擺脫了死記硬背有多舒服
問題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=="http://www.2cto.com/uploadfile/Collfiles/20141017/20141017083555427.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原創,如有建議,輕留言)