《delphi高手突破》节选(类与对象)——nicrosoft 2002.02.04

Nicrosoft 2002-02-03 11:25:06
上次贴出新书的第一章,出乎我的意料,反响热烈,得到许多网友的支持。
今天完成了第二章的撰写,在此节选一小段文字,希望继续得到大家的支持,指正。
当然,节选的量是非常少的(否则出版社也不答应,呵呵),不过,一斑可窥全豹,之后我会在每一章完成后,节选少量文字贴在这里。

===========================================================

在Object Pascal中,所有对象都被建立在内存的堆空间上,而非栈上,因此构造函数不会如同C++那样被编译器自动调用。构造对象和析构对象都是程序员的职责。
构造对象首先要为对象分配内存,这个步骤在Object Pascal中是由编译器支持完成的--即所谓的"编译器魔法(Compile Magic)",此过程程序员不必参与;接着要初始化对象的数据成员,编译器会负责"清零",但如果有特殊的赋值,可以在构造函数中完成;对象在被析构的时侯需要释放所申请的资源(非对象本身所占用内存),这些工作是析构函数的职责;对象本身所占内存的回收,同样由"编译器魔法"完成。

对象内存的分配及回收

编译器在为对象分配内存时,所提供的支持就是在调用构造函数之前插入这几行汇编代码:
test dl, dl
jz +$08
add esp, -$10
call @ClassCreate // 注意这行代码
以上代码的最后一行代码调用的是system.pas文件的第8949行的_ClassCreate函数(以Delphi 6为准),该函数具体为每个对象分配合适的内存。内存分配完成后是调用类的构造函数以初始化数据成员。之后,编译器会再插入以下几行汇编代码:
test dl, dl
jz +$0f
call @AfterConstruction
pop dword ptr fs:[$00000000]
add esp, $0c
其中主要工作是调用每个对象实例的AfterConstruction,这个调用在Delphi中没有用,它的存在是为C++Builder所保留的。
同样,析构对象时,首先要调用类的析构函数以释放对象申请的资源。之后是回收对象本身所占内存空间,这件工作是由编译器在调用析构函数后,插入以下的汇编代码来完成的:
call @BeforeDestruction
test dl, dl
jle +$05
call @ClassDestroy
这些代码所做的工作与构造对象分配内存时所做的是对应的,主要是对system.pas中第8997行的_ClassDestroy函数的调用。

构造函数与析构函数

定义构造函数使用Constructor关键字,按惯例,构造函数名称为Create(当然也可以用其他名称,但那绝非优良的设计!)。如:
type
TMyFamily = class // 为你的家庭定义的类
Private
FMyFatherName : String; // 你父亲的名字
FMyMotherName : String; // 你母亲的名字
…… // 你家庭中的其他成员
Public
Constructor Create(strFatherName, strMotherName : String);
…… // 其它方法
End;
也许你会问,如果我没有为我的类提供构造函数,它的对象能否被建立呢?答案是:可以。原因前面已经说了,对象本身所占内存的分配是由编译器完成的。而且由于Object Pascal中,所有类(除了TObject类本身)都是从TObject类派生,因此编译器会调用TObject.Create()构造函数,只是这个函数是一个空函数,它并不会对TMyFamily类的数据成员(FMyFatherName、FMyMotherName)初始化,它们会被自动清为空字符串(即''),因为TObject.Create()根本就不认识你的父、母亲!
创建对象时则直接调用构造函数,形式如下:
MyFamilyObject := TMyFamily.Create('Zhang', 'Li');

定义析构函数使用Destructor关键字,按惯例,析构函数名称为Destroy。如:
type
TMyClass = class
Public
Destructor Destroy(); override;
End;
之所以在析构函数声明最后加上override声明,是因为保证在多态的情况下对象能正确被析构(关于多态,将在2.4节中详述)。如果不加override关键字,编译器会给出类似"Method 'Destroy' hides virtual method of base type 'TObject'"的警告提示。警告的意思是你定义的Destroy隐藏了基类的虚方法TObject.Destroy(),那样的话,在多态的情况下就无法正确析构对象了。
注意:析构函数都需要加override声明。
同样,如果在你的类中没有特殊的资源需要被释放,那么你也可以不定义析构函数。只是,在析构对象的时候,应该调用对象的Free()方法而不是直接调用Destroy()。
MyFamilyObject.Free();
这是因为在Free()方法中会判断对象本身是否为nil,如果不为nil才调用对象的Destroy(),以增加安全性。既然有这样的更安全的做法,当然没有理由不这么做了。
注意:永远不要直接调用对象的Destroy(),而应该是Free()。
由此可以得出结论,在Object Pascal中你只需关注对象所申请的资源的分配与释放,而不必关心对象本身所占空间!
...全文
1273 116 打赏 收藏 转发到动态 举报
写回复
用AI写文章
116 条回复
切换为时间正序
请发表友善的回复…
发表回复
quantum 2002-02-22
  • 打赏
  • 举报
回复
算我一个,我买!
ihihonline 2002-02-22
  • 打赏
  • 举报
回复

你的书定价会是多少?

多写点高级PASCAL可不可以啊?
出来后,在网上能买得着吗?
lvguiqiang 2002-02-21
  • 打赏
  • 举报
回复
不错
bjay 2002-02-20
  • 打赏
  • 举报
回复
shou
cattor 2002-02-20
  • 打赏
  • 举报
回复
shou'cang
andersli 2002-02-20
  • 打赏
  • 举报
回复
up
gzyzljk 2002-02-20
  • 打赏
  • 举报
回复
这样的内容 好像在一本希望出版社出版的'编程高手成长之路7'系列书之一叫<<DELPHI编程教程>>的书上有了,不过还是有许多新的内容的,不是期望你的新书啊!
bpfrom 2002-02-19
  • 打赏
  • 举报
回复
你的书定价会是多少?
wdmusb 2002-02-19
  • 打赏
  • 举报
回复
好!
litangel 2002-02-18
  • 打赏
  • 举报
回复
我也想看看。
Crob 2002-02-18
  • 打赏
  • 举报
回复
是一本讲原理的书吧,类似Inside the c++ object model
这类书是饭后何休息时的好书,应用性不强,但可以长知识。
Crob 2002-02-18
  • 打赏
  • 举报
回复
是本讲原理的书,类似于Inside the C++ Object model
饭后休息时的好书,不适于应用,但能长知识
dbcontrols 2002-02-18
  • 打赏
  • 举报
回复
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . ::. . ::::. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . MM::. . LL::MMMMMM. . . . . . . . . . . . . . . . . . . . . . ::. . . .
. . . . . . . . . MMMM. LLMMMMMMMMMMMM. . . . . . . . . . . . . . . . . . . . FFMMLL. . .
. . . . . . . . . MMMMLLLLMMMMMMLLMMLLLLMMLL. . . . . . . . . . . . . . . . . . LLMMLL. .
. . . . . . . . . ::MMMMLLMMMMMMMMLLFFMMMMLL::. . . . . . . . . . . . . . . . . . MMMM::.
. . . . . . . . . . LLMM. MMMMMMLLMMMMMMLL::::. . . . . . . . . . . . . . ::. . . LLMMEE.
. . . . . . . . . . MMLLLLMMMMMMMMMMMMLLLL::. . . . . . . . . . . . . . . FFMMLLLLMMMMMM::
. . . . . . . . . . . . MMMMMMLLMMLLMMMMLL::::. . . . . . . . . . . . . ::. LLMM. LLMMMM::
. . . . . . . FFLL. . . LLLLMMMMMMMMMMMMMMMM. . . . . . . . . . . . . . LLLL::MMLL. MMMM::
. . . . . . . MM. . . LLMMMMMMMMMMMMMMMMMMMM. . . . . . . . . . . . . . . MMMMMMMM. MMMM::
. . . . . . . ::. . LLMMMMMMMMMMMMMMMMMMMMMMLL::. . . . . . . . . . . ::. LLMMMMMMMMLLMM::
. . . . . . ::::. LLMMMMMMMMMMMMMMMMMMMMMMMMMMLL. . . . . . . . . LLLL::::LLMMMMMMMMMMMMLL
. . . . . . LL. ::MMMMMMMMMMMMMMMMMMMMMMMMMMMM::. . . . . . . . . ::MMMM::::MMMMMMMMMMMMLL
. . . . . . ::::MMMMMMMMMMMMMMMMMMMMMMMMMMLL. . . LL::LLLL. . . . . LLMM::::MMMMMMMMLLMM::
. . . . . . . MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLMMMMMMLL. . . . . . MMMMLLMMMMMMMMMMLLMM::
. . . . . ::::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. . . . . LLMMMMMMMMMMMMMM. MMMM.
. . . . . . MMMMLLMMMMMMMMMMLLMMMMMMMMMMMMMMMMMMMMMMMMMMMM. . . LLMMMMMMMMMMMMMM::MMMMLL.
. . . . LL::MMMMLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLL. . EEMMMMMMMMMMMMMMLLMMMMLL::LL
. . . LLMMMMMMMMMMMM. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. ::EEMMMMMMMMMMMMMMMMMMMMMMMMMMMM::
. . . LLMMLLMMMMMMLL. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLL::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM::
. . . LLMMMMMMMMMM. . MMMMMMMMMMMMMMMMMMMMMMMMLL. . . LLLLLLLLLLFFMMMMMMMMLL::::LLMMMMMM.
. . . LLMMMMMMMMMM. . MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM::LLLLMMLLLL::. ::MMMMLLFFLL::::. . .
. . . . MMMMMMMM::. . MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLLL. . . LLMM::EELLMMMMMM::.
. . . . . LLMM::. . . MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. ::. . . ::MMMM. . . . . . .
. . . . . . . . . . . MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLL. . . . ::::MMMM. . . . . . .
. . . . . . . . . . . MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. . ::. MM. MMMM. . . . . . .
. . . . . . . . . . . MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLL::. ::LL::MMLL. . . . . . .
. . . . . . . . . . . MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMEEMMMMMMLLMMMMMM. . . . . . . .
. . . . . . . . . . . LLMMMMMMMMMMMMMMMMMMMMLLMM. LLMMMMMMMMMMMMMMLLMMMM. . . . . . . . .
. . . . . . . . . . MM::MMMMMMMMMMMMMMMMMMLLEE. LLMMMMMMMMMMMMMMMMMMMMLL. . . . . . . . .
. . . . . . . . ::LLLL. MMMMMMMMMMMMMM. . LL. . MMMMMMMMMMMMMMEEMMMMLL. . . . . . . . . .
. . . . . . . . . LLLL. LLMMMMMMMMLLLL::. . ::::MMMMMMMMMMMMMMLLLLMMMM. . . . . . . . . .
. . . . . . . ::. LL. ::::MMMMMMMM. . . ::::::MMMMMMMMMMMMMMMMMMLLMMMM. . . . . . . . . .
. . . . . . . . MMMMMMLLMMMMMMMMMM. . ::::LLLLMMMMMMMMMMMMMMMMMMLLMMMMLL. . . . . . . . .
. . . . . . . FFMMMMLL. MM::MMMMMMFF. ::::::LLMMMMMMMMMMMMMMMMMMLLMMMMMM. . . . . . . . .
. . . . . . . MMMMMM. ::MM. ::MMLL::::MMLL. MMMMMMMMMMMMMMMMMMMMMMMMMMMM. . . . . . . . .
. . . . . . . LLMMMMLL. MM. . . . LLMMMMLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. . . . . . . . .
. . . . . . . . MMMMLLMMMMLL. . LLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. . . . . . . . .
. . . . . . . ::MMMMMMMMMMMMMMMMMMMMMMMMFFMMMMMMMMMMMMMMMMMMMMMMMMMMMMLL. . . . . . . . .
. . . . . . . LLMMMMMMMMMMMMMMMMMMLL. MM::MMMMMMMMMMMMMMMMMMMMMMMMMMMM::. . . . . . . . .
. . . . . . . ::MMMMMMMMMMMMMM::MMMM. LLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. . . . . . . . . .
. . . . . . . . LLMMMMMMMMMM::. MMMM. . MMMMMMMMMMMMMMMMMMMMMMMMMMMMFF. . . . . . . . . .
. . . . . . . . . MMLLMMMMMMLL. MMMM::LLMMMMMMMMMMMMMMMMMM::MMMMMMMM. . . . . . . . . . .
. . . . . . . . . MM::MMMMMMMM. MMMMLLMMMMMMMMMMMMMMMMLLMMMMMMMMMM::. . . . . . . . . . .
. . . . . . . . . LLMMLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. . . . . . . . . . . .
. . . . . . . . . . MMMMMMMMMMMMMMMMMMMMMM. MMMMMMMMMMMMMMMMMM::MM. . . . . . . . . . . .
. . . . . . . . . . MMMMMMMMMM::. . LLMM. MMMMMMMMMMMMLLFFLLLL. MM::. . . . . . . . . . .
. . . . . . . . . . MM::MMMMLL. . . ::MM. MMMMMMMMLLLL::. . LL. MM::. . . . . . . . . . .
. . . . . . . . . LLMM. MMMMLL. . . MM::MMMMMMMMLL. . . . . LL::MMLL. . . . . . . . . . .
. . . . . . . . . LLMMLLLLMM::. . ::MMMMMMMMMMMM. . . . . . MMLLMMMM. . . . . . . . . . .
. . . . . . . . . LLMMMMLLMM. . . ::MMMMLL::MM::. . . . . . MMLLMMLL. . . . . . . . . . .
. . . . . . . . . ::MMMMMMLL. . . ::MMLLLLMMLL. . . . . . . MMFFMMLL. . . . . . . . . . .
. . . . . . . . . . MMMMMM::. . . ::MMMMMMMM. . . . . . . . FFMMMMLL::. . . . . . . . . .
. . . . . . . . . . MMMMMM::. . . LLMMMMMMMM. . . . . . . . MMMMMMMM. . . . . . . . . . .
. . . . . . . . . . MMMMMMLL. . . MMMMMMMMLL. . . ::::::. . ::MMMM::. . . . . . . . . . .
. . . . . . . . . . MMMMMM::. . MMMMMMMMMMMM. ::::::::. ::. . ::. . . . . . . . . . . . .
. . . . . . . . . . MMMMMM. . ::MMMMMMMMMMMM. . ::. ::. ::::. . . ::. . . . . . . . . . .
. . . . . . . ::. . MMMMMM. . MMMMMMMMMMMMMM. . . . . . . . . . . . . . . . . . . . . . .
::::::. . ::::::::. MMMMMM. LLMMMMMMMMMMMMFF. . . . . . . . . . . . . . . . . . . . . . .
. ::::. . . . . . . MMMMMMMMMMMMMMMMMMMMMM. . . . . . . . . . . . . . . . . . . . . . . .
. . ::::. . . . . ::MMMMMMMMMMMMMMMMMMMMMM. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . ::MMMMMMMMMMMMMMLLMMLLMM. ::. . . . . . . . . . . . . . . . . . . . . .
::. ::::::. ::. . ::MMMMMMMMMMMMMM::MMMM. . . . ::. . . . ::::::::::. . . . . . . . . . .
::::::::::::. . . . MMMMMMMMMMMM. MMMMLL. . . . . . ::. ::::::::. . . . . . . . . . . . .
::::::::::::::. . ::::MMMMMMLL. . MMMM. . . ::. ::::::. . . . . . . . . . . . . . . . . .
. ::::::::. ::. . ::. MMMMMM. . . MMMM. . . . . . . ::::::::. . . ::. . . . . . . . . . .
. . ::::::::. . ::LLMMMMMM::. . LLMMLL. . . . . . . . . . . ::. . . . . . . . . . . . . .
. . . ::. ::. ::. MMMMMMMM. . . MMMM::. . . . ::. ::. . ::::. . . . . . . . . . . . . . .
::. . . ::::::::MMMMMMMMMM. . LLMMMMLL. . . . . . . . . . . . . . . . ::. . . . . . . . .
. . ::::. ::. MMMMMMMMMMMM::FFMMMMMMFF. . . ::. . ::::::::. . . . . ::::. . . . . . . . .
::::::::::. LLMMMMMMMMMMLL. MMMMMMMMLL. . . . . . ::::::. . . . . . ::. . . . . . . . . .
::::. ::. LLMMMMMMMMMMMM. LLMMMMMMMM. . . . . . . . ::::::::. . . . . . . . . . . . . . .
::. . LLMMMMMMMMMMMMMMMMLLMMMMMMMMLL. . . . . . . . . . . ::::::. . . . . . . . . . . . .
. . . FFMMMMMMMMMMMMMMLLMMMMMM::LL. . . . . . . . . . . . ::::. . . . . . . . . . . . . .
::. LL. . . MMMMMM::LLFF. ::MM::. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. MMLL. ::. . MMMMMMLLFF::LLMM::LL. . . . . . . . . . . . . . . . . . . . . . . . . . . .
LLMMLL::LL::. ::MMMMMM::LL::MM::::::. . . . . . . . . . . . . . . . . . . . . . . . . . .
. MMMM::::LLLLLLMMMMLL::::LLEE::::. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . ::MMLL. . MMMMEE::::MM. . ::. . . ::. . . . . . ::. . . . ::. . . . . . . . . . . . .
. . ::LLMMFFMMMMMM. LL::. LL::::::::::::::::::. . . . ::. . ::::::. . . . . . . . . . . .
. . ::::::LLMMMMMM. ::LLLLMM. ::::::::::::::::::. ::::::::::::::::. . . . . . . . . . . .
. ::. . . . ::LL::. ::. ::::::::::::::::::::::::::::::::::::::::. ::. . . . . . . . . . .
Greenberet 2002-02-18
  • 打赏
  • 举报
回复
出书的时候通知大家一声:)
ansili 2002-02-17
  • 打赏
  • 举报
回复
哪里有买?我要.ansili@163.com
Liusp 2002-02-16
  • 打赏
  • 举报
回复
gz
wjohenw 2002-02-16
  • 打赏
  • 举报
回复
俺也期待,象这样的好书太少了
typhoon961 2002-02-16
  • 打赏
  • 举报
回复
快出书啊,我很期待
Nicrosoft 2002-02-16
  • 打赏
  • 举报
回复
to w8u:呵呵,我不否认有你说的“炒卖”的成分。毕竟,书写出来是要卖的。

不过,关于建议,我当然会吸收一部分符合我自己对这本书期望的意见,毕竟一个人想到的会有不全面。但我不可能接受所有人的意见,那样书也就没有了自己了。
辉歌 2002-02-16
  • 打赏
  • 举报
回复

感觉纯粹是在自我炒卖!不见得你听了我们的建议就会修改的。
加载更多回复(95)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧