java的this指針
① 一個c++虛函數與this指針的問題
1.
不可以。
2.
是。
3.
是。
你這個疑問就實際上涉及到了編譯技術。this指針你會發現他是C++的關鍵字,而不是在那個頭文件里聲明的變數。也就是說,this指針並不是一個真實存在的C++語言變數,「父類指針不能自動(隱式)轉換為子類指針」實際上是C++語言的變數類型規則,但this指針並非一個變數,所以不需要遵循此規則。從執行中的程序來說,this指針是幫助函數確定對象的位置。
如果非要問,this指針到底是儲存在哪裡?你去看網路,它是這樣說的「不存在所謂的this的「位置」,只是this表示了對象的存儲位置而已。&this違反語義規則,是錯誤的用法,不會編譯通過。」當然,這是從C++語言的層面上來談。在程序運行中,其實確實是有一個地方儲存this指針的值的,不過這只有在非靜態函數被調用才存在的。在X86處理器中,儲存這個值的地方是寄存器ecx,X86-64儲存這個值的地方是rcx。下面給出例子。
void G(IA* a)
{
a->F();
}這段對應的匯編語言重點如下:
mov
rcx,
[rsp+28h+arg_0]
<——這里就是把對象的首地址(就是變數a的值)放在rcx中。
call
qword
ptr
[rax]
<——調用F()函數。
virtual void F()
{
this->member++;
}mov
[rsp+arg_0],
rcx
<——將rcx(其實就是所謂this指針)壓進棧以防rcx寄存器有他用。
mov
rax,
[rsp+arg_0]
mov
eax,
[rax+0Ch]
<——通過this指針找到成員變數member的位置。
inc
eax
<——執行自增操作。
看到了吧,this指針不過就是類成員函數被調用時,被臨時儲存到rcx寄存器的對象首地址。
之所以啰嗦這么多,意思就是讓你明白(如果你被上面所述搞得一頭霧水),從程序實際運行的角度上看,this指針與其說是C++的指針,還不如說是編譯技術里的東西,匯編/機器語言里根本沒有類型一說(當然,機器最多分整數運行儲存單元和浮點數運算儲存單元),自然不存在什麼類型轉換了。