网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> Delphi编程 >> 文章正文
  Delphi2007新功能 -- 有限的栈对象            【字体:
Delphi2007新功能 -- 有限的栈对象
作者:佚名    文章来源:不详    点击数:    更新时间:2007-9-12    
           今天使用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: Parameterless constructors not allowed record types
//    constructor Create;
    
// error: A record cannot introduce a destructor
//    destructor TMyRecird;
    constructor Create(a: Integer);
    constructor TMyRecord; overload;
    constructor TMyRecord(a, b: Integer); overload;
//    constructor TMyRecord(a, b: Integer);
    procedure Display;
    property xi: Integer read x;
  end;

{ TMyRecord }

constructor TMyRecord.Create(a: Integer);
begin
  x :
= a;
  y :
= 0;
end;

procedure TMyRecord.Display;
begin
  ShowMessage(Format(
'x = %d, y = %d', [x, y]));
end;

constructor TMyRecord.TMyRecord;
begin
  x :
= 0;
  y :
= 0;
end;

constructor TMyRecord.TMyRecord(a, b: Integer);
begin
  x :
= a;
  y :
= b;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  rec: TMyRecord;
begin
  rec.TMyRecord(
100200);
  rec.Display;
end;

        可以看出,确实可以和C++一样定义一个局部record对象(不需要动态建立),而且可以使用该对象的方法和属性,请看TForm1.Button1Click方法的汇编码(CPU调试窗口粘贴下来的):

Unit1.pas.72: begin
0045ACDC 83C4F8           add esp,
-$08
Unit1.pas.
73: rec.TMyRecord(100200);
0045ACDF 8BC4             mov eax,esp
0045ACE1 B9C8000000       mov ecx,$000000c8
0045ACE6 BA64000000       mov edx,$
00000064
0045ACEB E8E4FFFFFF       call TMyRecord.TMyRecord
Unit1.pas.
74: rec.Display;
0045ACF0 8BC4             mov eax,esp
0045ACF2 E855FFFFFF       call TMyRecord.Display
Unit1.pas.
75: end;
0045ACF7 
59               pop ecx
0045ACF8 5A               pop edx
0045ACF9 C3               ret

        从汇编码中看,定义的TMyRecord变量rec确实是标准C++栈对象一样的,在调用其方法的时候也隐含传递了Self指针(mov  eax,esp),也就是说,rec在这里已经区别于普通的record变量,而是一个实实在在的“对象”变量!

        但是遗憾的是,它不能定义destructor方法,虽然可以定义constructor方法(不能定义为Tobject缺省的Create方法,带参数可以),但却不能在定义的时候自动调用构造方法(我原本以为和C++一样,定义一个和TMyRecord同名的constructor方法,可以自动调用的),如此一来,静态栈对象的主要优点就丧失了,如果手工调用构造方法,和定义一个普通record变量,然后调用静态过程没什么两样了。其实,Delphi已经把record改道这一步了,稍稍进一步就可以完完全全的使用栈对象,从技术上讲一点难度都没有,编译器只需要在栈中分配对象变量内存和销毁对象变量内存的同时,隐含调用一下构造方法和析构方法就可以了的。

        虽然很遗憾,但是还是为Delphi的这点进步而高兴,至少我们可以利用这一功能封装record,而且使用这有限的栈对象可以不用当心对象本身的销毁问题(record对象中动态分配的内存还是得手工释放或者调用它的某个方法释放)。

 




本文来源:http://blog.csdn.net/maozefa/archive/2007/08/27/1760612.aspx
站内文章搜索 高级搜索
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     在delphi中使用xml文档有…
     初探delphi 7 中的插件编…
     delphi 2006(dexter) & …
     获得windows的版本信息。
     “序列号输入助手”源代…
     rs232串口通讯模块
     ado方式下判断数据表是否…
  • Ant入门-配置和使用     选…

  • 浅析Spring框架下PropertyPl…

  • SPRING+STRUTS+HIBERNATE登录…

  • MVP——Model-Viewer-Presen…

  • C++ Object Model

  • constructor and destructor

  • 绑定HGE到AngelScript脚本系…

  • delegate C#关键字 (委托类型…

  • Boyer-Moore String Searchi…

  • 【游戏制作基础】网络游戏设…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David