1 乙個物件指標指向的乙個物件的資料區,該資料區前面4個位元組是乙個指標,指向的是大名鼎鼎的vmt,其實是self的位址,**如下:
[delphi]view plain
copy
print?
procedure tform1.btn3click(sender: tobject);
varchld: tchild;
p1, p2, p3, p4: pointer;
begin
chld := tchild.create;
try//物件指標
p1 := chld;
mmo1.lines.add(format('chld obj at:$%s', [inttohex(integer(p1), 8)]));
p2 := pointer(p1^);
//p2 p2指向的正式vmt的零位址
mmo1.lines.add(format('chld pointer at:$%s', [inttohex(integer(p2), 8)]));
p3 := pointer(integer(p2) + vmtselfptr);
mmo1.lines.add(format('self pointer at:$%s', [inttohex(integer(p3), 8)]));
p4 := pointer(p3^);
mmo1.lines.add(format('self pointer at:$%s', [inttohex(integer(p4), 8)]));
finally
freeandnil(chld);
end;
end;
procedure tform1.btn3click(sender: tobject);
var chld: tchild;
p1, p2, p3, p4: pointer;
begin
chld := tchild.create;
try//物件指標
p1 := chld;
mmo1.lines.add(format('chld obj at:$%s', [inttohex(integer(p1), 8)]));
p2 := pointer(p1^);
//p2 p2指向的正式vmt的零位址
mmo1.lines.add(format('chld pointer at:$%s', [inttohex(integer(p2), 8)]));
p3 := pointer(integer(p2) + vmtselfptr);
mmo1.lines.add(format('self pointer at:$%s', [inttohex(integer(p3), 8)]));
p4 := pointer(p3^);
mmo1.lines.add(format('self pointer at:$%s', [inttohex(integer(p4), 8)]));
finally
freeandnil(chld);
end;
end;
看到第二個指標的位址與第四個位址相同既可以說明問題
2 有些方法在編譯時已經確定了位址就可以不用建立物件而直接操作方法
1) 靜態方法,且不涉及類的私有資料
2 )類方法
注意幾點:
1> 其實1)本身可以寫成類方法
2> 類方法可以直接用類名來訪問,也可以用未建立的物件指標來訪問,當然也可以用實際有指向物件的指標變數來訪問
3> 類方法在實現時會檢測是否真的沒有訪問私有資料,由此可見,對於那些未涉及私有資料的方法,宣告為類方法是很方便的
4> 其他方法或者資料都需要通過self指標來定位,故一定要用建立了類物件的指標來訪問
Delphi物件指標小結
1 乙個物件指標指向的乙個物件的資料區,該資料區前面4個位元組是乙個指標,指向的是大名鼎鼎的vmt,其實是self的位址,如下 procedure tform1.btn3click sender tobject var chld tchild p1,p2,p3,p4 pointer begin ch...
指標與物件小結
使用常規表示法來宣告指向物件的指標。badstring s 將指標初始化為指向已有的物件 badstring s1 liming 13 badstring s s1 使用new來初始化指標,這將建立乙個新的物件 badstring s1 liming 13 badstring s4 new bads...
Delphi指標認識
大家都認為,c語言之所以強大,以及其自由性,很大部分體現在其靈活的指標運用上。因此,說指標是c語言的靈魂,一點都不為過。同時,這種說法也讓很多人 產生誤解,似乎只有c語言的指標才能算指標。basic不支援指標,在此不論。其實,pascal語言本身也是支援指標的。從最初的pascal發展至今的obje...