讨论:对象及对象的数据成员的本质.(10分)

  • 主题发起人 主题发起人 gencheng
  • 开始时间 开始时间
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语言和现在的大多数语言都将“指针”封装起来,并且一般不鼓励使用“指针”,但是,在一种语言内部,“指针”实际上是无所不在的,如:对象,数组等等的低层实现都离不开指针。并且“指针”的功能是非常强大的,善于使用“指针”可以解决程序设计中的很多技术难题。并且,一但深入的理解后,事必会在程序设计中大量使用“指针”这种高级技术。
 
  指针是什么?它是内存中的一个地址.在32位的系统中,比如windows中,它就是一个32位的内存地址!
  
  之所以有上述关于对象是指针的思考,是因为在用老外写的一个动态库(dll)中的一个回调函数中,提供了一个参数是pointer类型.这个参数你可以将任何一个对象传给它.用的时候,比如你传入的是一个窗体对象,你可以这样TMyForm(pointer1)重新获得这个对象的引用,然后这个窗体对象原来有什么,你都可以使用.
  
  所以说,如果你想在某个函数中传递对象,也可以将它设为一个指针参数传递.这样程序会更加灵活!
 
1.有指向自己的指针this
2.有虚方法表 用函数指针实现
这样的结构 Record
 
简单的说
简单类型保存在栈里,比如Integer,record等
对象是保存在堆里,对象的指针保存在栈里
 
数据成员是行尸走肉
实例对象是有血有肉
类及派生类是四月肥,越来越肥
 
不錯的概述,頂..
 
“对象是保存在堆里,对象的指针保存在栈里”
  说的好!
 
多人接受答案了。
 
后退
顶部