今天使用Delphi2007,一个误输入,无意中发现Delphi2007的record类型居然能够和TObject一样定义方法和属性,而且不需要调用类似TObject.Create方法就能生成一个record对象。这是否意味着Delphi2007也能和C++一样,不仅能使用堆对象(new),也能使用栈对象(静态对象)呢?
通过实验,答案是肯定的!这使我感到很兴奋,因为Delphi从诞生之日起,就限定了只能继承于TObject的堆对象,必须通过Create和Free来建立和销毁一个对象,而不能使用栈对象。而栈对象的好处就在于它能和其它类型一样很方便的定义,它能自动调用构造函数和析构函数,在作用域范围内(如函数内的局部对象)不必当心对象的建立和销毁问题。要是Delphi具有了该功能,无意是Delphi编程者们的福音。
不过,进一步的测试却比较失望,请看下面的代码:
type
TMyRecord=record
private
x:Integer;
y:Integer;
public
//error:Parameterlessconstructorsnotallowedrecordtypes
//constructorCreate;
//error:Arecordcannotintroduceadestructor
//destructorTMyRecird;
constructorCreate(a:Integer);
constructorTMyRecord;overload;
constructorTMyRecord(a,b:Integer);overload;
//constructorTMyRecord(a,b:Integer);
procedureDisplay;
propertyxi:Integerreadx;
end;
{TMyRecord}
constructorTMyRecord.Create(a:Integer);
begin
x:=a;
y:=0;
end;
procedureTMyRecord.Display;
begin
ShowMessage(Format('x=%d,y=%d',[x,y]));
end;
constructorTMyRecord.TMyRecord;
begin
x:=0;
y:=0;
end;
constructorTMyRecord.TMyRecord(a,b:Integer);
begin
x:=a;
y:=b;
end;
procedureTForm1.Button1Click(Sender:TObject);
var
rec:TMyRecord;
begin
rec.TMyRecord(100,200);
rec.Display;
end;
可以看出,确实可以和C++一样定义一个局部record对象(不需要动态建立),而且可以使用该对象的方法和属性,请看TForm1.Button1Click方法的汇编码(CPU调试窗口粘贴下来的):
Unit1.pas.72:begin
0045ACDC83C4F8addesp,-$08
Unit1.pas.73:rec.TMyRecord(100,200);
0045ACDF8BC4moveax,esp
0045ACE1B9C8000000movecx,$000000c8
0045ACE6BA64000000movedx,$00000064
0045ACEBE8E4FFFFFFcallTMyRecord.TMyRecord
Unit1.pas.74:rec.Display;
0045ACF08BC4moveax,esp
0045ACF2E855FFFFFFcallTMyRecord.Display
Unit1.pas.75:end;
0045ACF759popecx
0045ACF85Apopedx
0045ACF9C3ret
从汇编码中看,定义的TMyRecord变量rec确实是标准C++栈对象一样的,在调用其方法的时候也隐含传递了Self指针(mov eax,esp),也就是说,rec在这里已经区别于普通的record变量,而是一个实实在在的“对象”变量!
但是遗憾的是,它不能定义destructor方法,虽然可以定义constructor方法(不能定义为Tobject缺省的Create方法,带参数可以),但却不能在定义的时候自动调用构造方法(我原本以为和C++一样,定义一个和TMyRecord同名的constructor方法,可以自动调用的),如此一来,静态栈对象的主要优点就丧失了,如果手工调用构造方法,和定义一个普通record变量,然后调用静态过程没什么两样了。其实,Delphi已经把record改道这一步了,稍稍进一步就可以完完全全的使用栈对象,从技术上讲一点难度都没有,编译器只需要在栈中分配对象变量内存和销毁对象变量内存的同时,隐含调用一下构造方法和析构方法就可以了的。
虽然很遗憾,但是还是为Delphi的这点进步而高兴,至少我们可以利用这一功能封装record,而且使用这有限的栈对象可以不用当心对象本身的销毁问题(record对象中动态分配的内存还是得手工释放或者调用它的某个方法释放)。
后记:以前在DOS下,以C/C++为主,Pascal只用过Turbo Pascal4.0,对以后Pascal的版本并不十分了解,今天看了网友housisong的留言,才知道我所谓的新功能--有限栈对象,Delphi中早就有了,如Delphi7.0就可以使用Object关键字定义栈对象,而且比2007的record类型还完善一些,record不能继承,而object对象能够继承,看来我真是孤陋寡闻了!!!
分享到:
相关推荐
不错的delphi课程设计项目--delphi人才信息管理系统 不错的delphi课程设计项目--delphi人才信息管理系统 不错的delphi课程设计项目--delphi人才信息管理系统 不错的delphi课程设计项目--delphi人才信息管理系统 不错...
PowerPDF(Delphi 2007-2010-XE)
不错的delphi课程设计项目--delphi网页邮件抓发系统 不错的delphi课程设计项目--delphi网页邮件抓发系统 不错的delphi课程设计项目--delphi网页邮件抓发系统 不错的delphi课程设计项目--delphi网页邮件抓发系统 不错...
不错的delphi课程设计项目--家庭财务管理系统 不错的delphi课程设计项目--家庭财务管理系统 不错的delphi课程设计项目--家庭财务管理系统 不错的delphi课程设计项目--家庭财务管理系统 不错的delphi课程设计项目--...
delphi语言的modbus-tcp组件,完整功能。based on Indy 9 and Indy 10
Delphi手册----全面地介绍delphi的各项功能!.doc
DELPHI 7 学习---------摇号
DELPHI 学习--------辐射渐变色
不错的delphi课程设计项目--dephi+sqlserver2000试卷生成系统 不错的delphi课程设计项目--dephi+sqlserver2000试卷生成系统 不错的delphi课程设计项目--dephi+sqlserver2000试卷生成系统 不错的delphi课程设计项目--...
DELPHI 学习--------水平渐变色。
DELPHI 学习--------D3D 旋转。Direct3D ,顶点及材质的使用
DELPHI 学习--------带声音提示的定时器。含mp3播放模块
Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-...
DELPHI 学习----用控件做滚动动画.简单的内容
delphi学习总结----动态加载TreeView信息 delphi TreeView 动态加载 控件
delphi7-json-superobject delphi7-json-superobject
Delphi----试卷生成系统代码 用户名:sa 密码:sa
delphi综合数据库--服装销售系统源代码 delphi综合数据库--服装销售系统源代码
Borland Delphi 6开发基础-面向对象
delphi函数大全--delphi参考书,比较全的delphi的参考函数。