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

熱點內容
wemall微商城源碼 發布:2025-05-14 22:15:20 瀏覽:803
隆地優選交易密碼是什麼 發布:2025-05-14 21:53:23 瀏覽:94
強酸強鹼存儲櫃 發布:2025-05-14 21:45:16 瀏覽:564
車輛參數配置包括什麼 發布:2025-05-14 21:31:03 瀏覽:163
怎麼引入安卓項目 發布:2025-05-14 21:26:39 瀏覽:824
游戲輔編程 發布:2025-05-14 21:18:49 瀏覽:687
三菱plc一段二段密碼什麼意思 發布:2025-05-14 21:17:16 瀏覽:528
電腦開機密碼忘記了怎麼破解 發布:2025-05-14 21:09:40 瀏覽:57
pythondict格式 發布:2025-05-14 21:09:38 瀏覽:887
落葉片拍攝腳本 發布:2025-05-14 20:40:49 瀏覽:800