Object Pascal:从对象指针谈起

原创 2001年10月11日 22:19:00

 

 

 

 

 

Object Pascal:从对象指针谈起<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

作者: Musicwind®

创建时间: 2001-08-27

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

更新历史:No.1

更新时间:2001-08-27 19:47

更新人员:Musicwind®

更新备注:创建。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

1.         对象指针无处不在

有人说指针是C语言的灵魂,但在Object Pascal中又何尝不是如此呢!你看程序中最常见的“Form1: TForm1;”的声明,还有“procedure TForm1.Button1Click(Sender: TObject);”这样的语句,其中的Form1不正是一个对象指针么?Sender,不也是的么?在Object Pascal中,通过一个对象指针来访问一个对象实例是最直接、最有效的方式。

 

2.         对象指针的存储

当你声明一个TObject(或者TObject的派生类)类型的变量的时候,你便获得了一个对象指针,但是那只是一个指针而已,系统除了给你四个字节的存储空间外,并没有给你更多。并且,最初那四个字节的值是不确定的,这意味着你不能认为它一定是一个nil或者别的什么值。

 

3.         对象指针只有一种

对象指针无论怎么千变万化,都可以归为一种,那就是TObject类型的对象指针。因为所有其它类,都是TObject派生,因此TObject类型的指针到处适用。比如这样的代码:

var

  Obj: TObject;

  Form: TForm;

begin

  //….

  Obj := Form; //可以有这样的代码,这里的类型转换是自动完成的。

 

end;

也许你会问,那么反过来可不可以呢?当然可以,但是没有那么方便。比如:

begin

Form := TForm(Obj);  // ß 这里需要经过强制转换

//…

end;

正如你所知道的,不同类型的变量是否可以互相转换,取决于它们对于存储空间的需求如何。正因为同是对象指针,对存储空间的要求完全一致,所以强制转换不成问题。

对象指针只有一种,似乎也可以总结为“天下指针皆一家”这句话。

 

4.         灵活运用

有没有尝试过这样的代码呢?

var

  i: Integer;

  dw: DWORD;

begin

  I := Integer(Button1);

  ShowMessage(TButton(I).Caption);

  dw := DWORD(Button1);

  ShowMessage(TButton(dw).ClassName);

end;

你会发现,原来IntegerDWORD也可以作为对象指针来使用。原因自然是因为它们的存储空间与TObject类型的指针所要求的相同。

推而广之,只要有四个字节……(后面就不用我说了吧?),或者套用阿基米德的一句名言“只要给我四个字节,我就可以……”。

 

Object Pascal的世界其实也很精彩,只要你肯发现!

更多文章

 

[文终]

浅谈Object Pascal的指针

浅谈Object Pascal的指针      大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人...
  • kunlun122
  • kunlun122
  • 2013年10月23日 09:32
  • 626

Object-C基础(5)——指针

要接受的观点     1.操作系统管理内存分配(有人来了,要分房间给它住)、内存回收(人走了,房间要收回来)的方式就是给内存编号。这个编号是二进制的编号,而且与操作系统位数相关。     2.  所有...
  • panjican
  • panjican
  • 2016年03月27日 11:43
  • 965

Pascal基础教程

第一课 初识Pascal语言   信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查选手的智力和使用计算机解题的能力。选手首先应针对竞赛中题目的要求构建数学模型,进而构造出计算机可以接受的算法,之...
  • bytxl
  • bytxl
  • 2014年11月11日 14:13
  • 1668

pascal 指针 讲解

指  针 指针的动态变量       1.定义指针类型     在Turbo Pascal中,指针变量中存放的某个存储单元的地址,即指针变量指向某个存储单元。一个指针变量仅能指向某一种类型...
  • zz_ylolita
  • zz_ylolita
  • 2014年04月12日 21:39
  • 1336

C++类的对象和类的指针的区别、指针和引用的区别

#include #include using namespace std; class Student { public: static int number; str...
  • liulina603
  • liulina603
  • 2015年08月05日 08:44
  • 2999

JS对象Object的常用方法汇总

//Object.assign函数 //将来自一个或多个源对象中的值复制到一个目标对象 var first = {name : 'kong'}; var last = {age : 18}; var ...
  • kongjunchao159
  • kongjunchao159
  • 2017年04月11日 15:06
  • 757

[Objective-C] 释放对象时在release之后要设成nil

参考:http://stackoverflow.com/questions/3072003/why-set-object-to-nil-after-sending-release-message-in...
  • yasi_xi
  • yasi_xi
  • 2015年07月01日 09:33
  • 2295

打印object对象

一般情况在测试js时,如果接口返回的数据是object对象。 如果不知道这个对象里面具体的属性就取值容易得到undefined。 哪么怎么知道一个object对象里面到底是什么东西呢。 答案就是...
  • yaerfeng
  • yaerfeng
  • 2014年09月19日 18:41
  • 3742

对象和对象指针以及对象引用的使用

如下程序:  #include   #include   using namespace std;  class Student  {      public:      sta...
  • yeluoyunfei
  • yeluoyunfei
  • 2014年04月12日 14:32
  • 938

js 遍历 object 属性和值的方法

guofunction( o, maxLevel, level ) { if ( typeof level == "undefined" ) { level = 0; ...
  • renpinghao
  • renpinghao
  • 2014年11月11日 20:50
  • 10674
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Object Pascal:从对象指针谈起
举报原因:
原因补充:

(最多只允许输入30个字)