G
gencheng
Unregistered / Unconfirmed
GUEST, unregistred user!
讨论:对象及对象的数据成员的本质.
Delphi中的对象都是按照引用使用的,它是建立在堆(heap)上的.所以本质上在Delphi中对象就是指针,比如在<Delphi高手突破>书中的以下例子。
Type
TMyClass = class
Public
FMember1 : Integer;
FMember2 : Integer;
FMember3 : WORD;
FMember4 : Integer;
Procedure Method();
End;
var
Obj : TMyClass;
begin
Obj := TMyClass.Create();
with memo1.Lines do
begin
Add('对象大小:' + IntToStr(Obj.InstanceSize));
Add('对象所在地址 :' + IntToStr(Integer(Obj))); //Obj对象在内存中的地址
Add('FMember1所在地址:' + IntToStr(Integer(@Obj.FMember1)))
//数据成员FMember1的地址
Add('FMember2所在地址:' + IntToStr(Integer(@Obj.FMember2)));
Add('FMember3所在地址:' + IntToStr(Integer(@Obj.FMember3)));
Add('FMember4所在地址:' + IntToStr(Integer(@Obj.FMember4)));
end;
Obj.Free();
end;
上例中,这一句:
Integer(Obj)
取得了Obj对象在内存中的地址,它的结果是正确的。假如将上句改为这样:
Integer(@Obj)
它也取出了一个地址。不过,取出的就不是Obj对象的地址,而是“Obj对象的指针”的地址。这一点很重要,因为它揭示出“对象本身就是指针”的本性!
接下来,再看一下这一句:
Integer(@Obj.FMember1)
它取出了Obj对象的数据成员FMember1的地址。Obj是对象,而它的数据成员FMember1可不是一个对象,而是一个Integer类型的变量,所以,要取它的地址,就要用@运算符来取了。
上面是我的理解,欢迎大家讨论!
Delphi中的对象都是按照引用使用的,它是建立在堆(heap)上的.所以本质上在Delphi中对象就是指针,比如在<Delphi高手突破>书中的以下例子。
Type
TMyClass = class
Public
FMember1 : Integer;
FMember2 : Integer;
FMember3 : WORD;
FMember4 : Integer;
Procedure Method();
End;
var
Obj : TMyClass;
begin
Obj := TMyClass.Create();
with memo1.Lines do
begin
Add('对象大小:' + IntToStr(Obj.InstanceSize));
Add('对象所在地址 :' + IntToStr(Integer(Obj))); //Obj对象在内存中的地址
Add('FMember1所在地址:' + IntToStr(Integer(@Obj.FMember1)))
//数据成员FMember1的地址
Add('FMember2所在地址:' + IntToStr(Integer(@Obj.FMember2)));
Add('FMember3所在地址:' + IntToStr(Integer(@Obj.FMember3)));
Add('FMember4所在地址:' + IntToStr(Integer(@Obj.FMember4)));
end;
Obj.Free();
end;
上例中,这一句:
Integer(Obj)
取得了Obj对象在内存中的地址,它的结果是正确的。假如将上句改为这样:
Integer(@Obj)
它也取出了一个地址。不过,取出的就不是Obj对象的地址,而是“Obj对象的指针”的地址。这一点很重要,因为它揭示出“对象本身就是指针”的本性!
接下来,再看一下这一句:
Integer(@Obj.FMember1)
它取出了Obj对象的数据成员FMember1的地址。Obj是对象,而它的数据成员FMember1可不是一个对象,而是一个Integer类型的变量,所以,要取它的地址,就要用@运算符来取了。
上面是我的理解,欢迎大家讨论!