本人用delphi和VC++做了一个相同的简单类,渎职包含有两个数据成员和一些访问函数,具体声明如下:
delphi
type
info=class
private
name:string;
Age;integer;
...
end;
var
Dtest:info;VC++
calss info{
private:
CString name;
int Age;
...
};info Ctest;用sizeof()函数可知:
sizeof(Ctest)=8;
sizeof(Dtest)=4;
sizeof(Age)=4;
sizeof(string)=4;
sizeof(CString)=4;
由此可知delphi中的对象全为指针类型那伟大下能给小弟指点一下这其中的奥秘
delphi
type
info=class
private
name:string;
Age;integer;
...
end;
var
Dtest:info;VC++
calss info{
private:
CString name;
int Age;
...
};info Ctest;用sizeof()函数可知:
sizeof(Ctest)=8;
sizeof(Dtest)=4;
sizeof(Age)=4;
sizeof(string)=4;
sizeof(CString)=4;
由此可知delphi中的对象全为指针类型那伟大下能给小弟指点一下这其中的奥秘
delphi中的对象是存放在堆中的,你声明的一个对象变量,大家
叫它引用 ,就是这个form1:tform1,在对应的编译好的目标代码
(应该是汇编的代码段吧?)里边,它就是一个指针,你要使用对象就
必须调用constructor为引用(form1 我称它为对象变量,更好理解)
创一个可用的对象,就是如此,比c++里边好理解多了.这一点跟java
里边类似,可惜没有delphi编程思想,你可以看一下java编程思想里边
有关引用的东西,也可以看一下《delphi技术手册》里对象模型那几
章
在delphi中真的很少用指针了,但其实又到处都用到,:)
~~~说的不好,大家不要见笑
type
test=object
private
name:string;
age:integer;
...
end;
var
t:test;
sizeof(t)=8
这又是怎么回事?
private
name:string;
age:integer;
age1:integer;
age2:integer;
age3:integer;
end;procedure TForm1.Button1Click(Sender: TObject);
var
t:test;
begin
showmessage(inttostr(sizeof(t))); // 4
end;
小弟是从object中继承来的,不信你再试试。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type ttest = class(TObject)
private
name:string;
age:integer;
end; TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
t:ttest;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(sizeof(t))); /// 4
end;end.
我根本就没用class这个关键字,你是这只用object这个关键字,据说这是老版本的pascall类声明方法,tp5以上都支持,我不明白的是这样一个对象的构造函数为什么一定要显示调用呢?
-------------------------------------
见
http://expert.csdn.net/Expert/topic/1492/1492518.xml?temp=3.977603E-02
TObject是所有对象的基本类,那么,一个对象到底是什么? DELPHI中的任何对象都是一个指针,这个指针指明该对象在内存 中所占据的一块空间!虽然,对象是一个指针,可是我们引用对象的成员时却不用写成这样的代码MyObject^.GetName,而只能写成MyObject.GetName,这是Object Pascal语言扩充的语法,是由编译器支持的。使用C++ Builder的朋友 就很清楚对象与指针的关系,因为在C++ Builder的对象都要定义为指针。对象指针指向的地方就是对象存储数据的对象空间,我们来分析一下对象指针指向的 内存空间的数据结构。
对象空间的头4个字节是指向该对象类的虚方法地址表(VMT – Vritual Method Table)。接下来的空间就是存储对象本身成员数据的空间,并按从该对象最原始祖先类的数据成员到该对象类的数据成员的总顺序,和每一级类中数据成员的定义顺序存储。
类的虚方法地址表(VMT)保存从该类的原始祖先类派生到该类的所有类的虚方法的过程地址。类的虚方法,就是用保留字 vritual声明的方法,虚方法是实现对象多态性的基本机制。虽然,用保留字dynamic声明的动态方法也可实现对象的多态性,但这样的方法不保存在虚方法 地址表(VMT)中,它只是Object Pascal提供的另一种可节约类存储空间的多态实现机制,但却是以牺牲调用速度为代价的。
即使,我们自己并未定义任何类的虚方法,但该类的对象仍然存在指向虚方法地址表的指针,只是地址项的长度为零。可是,在TObject中定义的那些虚方法,如Destroy、FreeInstance等等,又存储在什么 地方呢?原来,他们的方法地址存储在相对VMT指针负方向偏移的空间中。其实,在VMT表的负方向偏移76个字节的数据空间是对象类的系统数据结构,这些数据结构是与编译器相关的,并且在将来的DELPHI版本中有可能被改变。
因此,你可以认为,VMT是一个从负偏移地址空间开始的数据结构,负偏移数据区是VMT的系统数据区,VMT的正偏移数据是用户数据区(自定义的虚方法地址表)。TObject中定义的有关类信息或对象运行时 刻信息的函数和过程,一般都与VMT的系统数据有关。
一个VMT数据就代表一个类,其实VMT就是类!在Object Pascal中我们用TObject、TComponent等等标识符表示类,它们在DELPHI的内部实现为各自的VMT数据。而用class of保留字定义的类的类型, 实际就是指向相关VMT数据的指针。
对我们的应用程序来说,VMT数据是静态的数据, 当编译器编译完成我们的应用程序之后,这些数据信息已经确定并已初始化。我们编写的程序语句可访问VMT相关的信息,获得诸如对象的尺寸、类名或运行时 刻的属性资料等等信息,或者调用虚方法或读取方法的名称与地址等等操作。
当一个对象产生时,系统会为该对象分配一块内存 空间,并将该对象与相关的类联系起来,于是,在为对象分配的数据空间中的头4个字节,就成为指向类VMT数据的指针。