`
sogotobj
  • 浏览: 639203 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Delphi2007新功能 -- 有限的栈对象

阅读更多
今天使用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;
0045ACF7
59popecx
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对象能够继承,看来我真是孤陋寡闻了!!!

分享到:
评论

相关推荐

    chakracore-delphi.rar

    通过这篇文章,读者将了解到如何将ChakraCore这一强大的JavaScript引擎引入到Delphi项目中,从而在Windows平台上构建出性能优异、功能丰富的JavaScript应用。同时,这也将为开发者提供一种新的思考方式,即如何将...

    Delphi_2009_2010_XE_泛型使用全集(队_栈_字典_列表_对象列表)

    ### Delphi 泛型使用全集(队列_栈_字典_列表_对象列表) #### 一、泛型概述 在 Delphi 中,泛型编程允许开发人员编写灵活且可重用的代码,该代码可以操作不同类型的值。通过使用泛型,我们可以创建能够处理各种...

    Dlephi链表实现栈操作_delphi_

    通过封装链表的节点操作,我们可以轻松地实现栈的基本功能,同时得益于链表的特性,这种实现方式在处理大量数据时也能保持较好的性能。在实际项目中,这样的数据结构设计可以极大地提高代码的可读性和可维护性。

    Delphi面向对象编程思想

    Delphi中的构造函数(constructor)用于初始化新创建的对象,而析构函数(destructor)在对象生命周期结束时负责清理资源。构造函数使用`constructor`关键字,而析构函数使用`destructor`关键字,且两者都自动调用...

    delphi 画图撤销控件

    总的来说,这个"delphi 画图撤销控件"提供了一种在Delphi中实现撤销画图功能的方法,它涉及到命令模式、历史栈、图形绘制、事件处理以及组件设计等多个编程概念。通过学习和使用这个控件,开发者能够更好地理解和...

    delphi7从入门到精通 delphi7从入门到精通

    Delphi7作为一款功能强大的集成开发环境(IDE),被广泛应用于Windows应用程序的开发。它基于Object Pascal语言,并结合了可视化编程技术和组件对象模型(COM)技术。Delphi7不仅能够帮助开发者快速构建高效的桌面应用...

    delphi 端口监听例子

    本主题聚焦于如何使用Delphi实现端口监听功能,这是一个关键的网络编程技术,用于接收通过特定网络端口传输的数据。 端口监听是网络通信的基础,它涉及到TCP/IP协议栈中的网络套接字(socket)编程。在Delphi中,你...

    delphi7 类似IE的前进后退功能 (VCL组件).

    这个栈存储了用户操作的历史轨迹,每当用户进行一次新的操作,旧的状态会被推入栈中。当用户点击“后退”按钮时,栈顶的状态会被弹出并恢复;点击“前进”按钮,则是将栈顶的状态再次压入栈中,然后恢复。 实现这一...

    delphi快速入门

    Delphi 是一种基于 Object-Oriented Programming(面向对象编程)的技术栈,主要用于 Windows 平台的应用程序开发。它使用 Pascal 语言的一个现代版本,即 Object Pascal。 #### 二、Delphi 的历史与语言特点 ####...

    Delphi版websocket服务端

    Delphi提供了强大的面向对象编程环境和丰富的第三方库支持,使得开发WebSocket服务端变得更加便捷。使用这个DLL,开发者可以快速集成WebSocket功能,减少从零开始编写协议栈的工作量,同时也能确保与各种WebSocket...

    IM飞鸽传达书 delphi版

    Delphi是一种强大的Windows应用开发工具,以其高效、直观的集成开发环境(IDE)和面向对象的Pascal语言而闻名。这款IM飞鸽传达书的Delphi版本,意味着它的源代码是使用Delphi编写的,开发者可以借此学习到如何利用...

    新深入Delphi6网络编程

    Delphi6是Borland公司推出的面向对象的快速应用程序开发工具,它以其高效的编译器和直观的IDE(集成开发环境)而受到广大程序员的喜爱。在网络编程领域,Delphi6提供了强大的网络组件库,使得开发者能够方便地创建...

    用Delphi编程实现Flash Video播放器

    ### 用Delphi编程实现Flash Video播放器 #### 摘要 随着互联网技术的不断发展,视频内容成为了网络上最受欢迎的多媒体形式之一。其中,FLV(Flash Video)格式因其体积小、播放流畅等特点,在早期的网络视频传输中...

    标准计算器(delphi)

    Delphi是一款强大的面向对象的编程环境,它基于Pascal语言,以其高效的编译器和直观的可视化组件库而受到开发者喜爱。在这个项目中,我们讨论的是一个由用户自行开发的“标准计算器”,它实现了基本的数学运算功能,...

    Delphi5开发人员指南

    2.17 使用Delphi对象 58 2.17.1 声明和实例化 58 2.17.2 析构 59 2.18 方法 59 2.18.1 方法的类型 60 2.18.2 属性 61 2.18.3 可见性表示符 62 2.18.4 友类 62 2.18.5 对象的秘密 63 2.18.6 TObject:所有对象的祖先 ...

    Delphi考试系统

    4. 扩展性强:系统设计遵循模块化原则,便于后期增加新功能或进行优化升级。 四、实施与维护 开发Delphi考试系统时,需考虑系统部署、数据库设计、网络环境优化等方面,确保系统在不同环境下都能正常运行。同时,...

    delphi简单的绘图器

    7. **撤销/重做功能**: 为了提供撤销和重做功能,需要维护一个历史记录栈,每次用户绘制新的线条或形状时,将当前状态推入栈中。当用户选择撤销时,从栈顶弹出状态并应用,重做则将刚刚弹出的状态重新压入栈并应用。...

    网络封包截取源码(DELPHI)

    DELPHI程序需要理解网络协议栈,如TCP/IP,以解析出协议头信息和负载数据。同时,这些信息会被保存到指定文件,例如本例中的"C盘的123.TXT",可能包含封包的时间戳、源IP、目标IP、端口号、协议类型等。 5. **事件...

Global site tag (gtag.js) - Google Analytics