當前位置:首頁 » 編程語言 » java的this指針

java的this指針

發布時間: 2024-12-30 18:50:32

① 一個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++的指針,還不如說是編譯技術里的東西,匯編/機器語言里根本沒有類型一說(當然,機器最多分整數運行儲存單元和浮點數運算儲存單元),自然不存在什麼類型轉換了。

熱點內容
多ip伺服器如何實現域名 發布:2025-01-02 20:29:38 瀏覽:549
聯網伺服器1302什麼意思 發布:2025-01-02 20:28:50 瀏覽:900
樂視手機相冊在哪個文件夾 發布:2025-01-02 20:22:27 瀏覽:570
騰訊雲伺服器部署 發布:2025-01-02 20:18:04 瀏覽:508
如何擠進伺服器選課 發布:2025-01-02 20:12:16 瀏覽:766
怎麼設置安卓登陸注冊 發布:2025-01-02 19:50:17 瀏覽:138
在線編譯器python 發布:2025-01-02 19:50:17 瀏覽:697
編程員轉型 發布:2025-01-02 19:49:32 瀏覽:133
xp解壓亂碼 發布:2025-01-02 19:46:22 瀏覽:602
vt壓縮 發布:2025-01-02 19:39:05 瀏覽:625