Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Delphi中的析构函数命名为?_Delphi_Destructor - Fatal编程技术网

为什么Delphi中的析构函数命名为?

为什么Delphi中的析构函数命名为?,delphi,destructor,Delphi,Destructor,Delphi中的析构函数通常被命名为“Destroy”,但据我所知,您也可以 以不同的方式命名析构函数 有多个析构函数 有什么理由这样实施吗?不同名称/多个析构函数的可能使用情形是什么?理论上,您可以手动调用不同的析构函数来释放不同的外部资源,如中断引用计数循环、删除或只是关闭文件等 此外,由于对象Pascal语言没有那些神奇的new/delete操作,因此应该有一些标识符来调用以处理对象 我更愿意回顾一下 “带对象的Turbo-Pascal”样式的对象具有这两种特性—您可以调用“magic

Delphi中的析构函数通常被命名为“Destroy”,但据我所知,您也可以

  • 以不同的方式命名析构函数
  • 有多个析构函数

有什么理由这样实施吗?不同名称/多个析构函数的可能使用情形是什么?

理论上,您可以手动调用不同的析构函数来释放不同的外部资源,如中断引用计数循环、删除或只是关闭文件等

此外,由于对象Pascal语言没有那些神奇的new/delete操作,因此应该有一些标识符来调用以处理对象

我更愿意回顾一下

“带对象的Turbo-Pascal”样式的对象具有这两种特性—您可以调用“magical”
Dispose
过程,但显式指定要调用的析构函数,因为语言本身不知道要选择什么。类似地,“魔术”程序
New
必须与手动选择的构造函数一起提供

然而,这违反了DRY原则:编译器知道我们调用的是d-tor或c-tor,但我们必须另外调用这些“New”和“Dispose”函数。从理论上讲,这可能是为了将内存分配和信息供给解耦,并以我们喜欢的方式将它们结合起来。但我不认为这个功能实际上被广泛使用

有趣的是,Apple Objective C中使用了相同的设计。首先为对象分配内存,然后为新实例调用构造函数:

当Delphi对该模型进行优化时,很少有人做出使事情更加简化(和统一)的决策。内存[de]分配策略被转移到类级别,而不是调用站点。这使得调用“New”和命名构造函数的冗余性形成了鲜明的对比。其中一个不得不放弃

C++/C#/Java选择为它保留一个特殊的语言级关键字,使用重载函数提供不同的C-TOR。也许这与美国式的计算机语言相对应

然而,Pascal的核心有两个概念:冗长和词汇量小。可以说,他们可以用其他欧洲学校的语言(如Scala)进行跟踪。如果可能的话,这些关键字应该从语言本身中删除,并移动到外部模块-您可以从项目中添加或删除的库。重载函数在语言中引入的时间要晚得多,早期的首选是使用两个不同名称(自文档化)的函数名

这两种想法都可能导致Delphi删除“魔术”过程,并仅通过使用的函数名推断调用站点上的对象创建/销毁。如果调用
MyVar.Destroy
,编译器将查看
.Destroy
的声明,并知道我们正在删除该对象。类似地,它知道
TMyType.CreateXXX(YYY,ZZZ)
是一个对象实例,这是由于
CreateXXX
的声明方式造成的

<> P>为了使C++和Dor在C++中没有命名,Delphi必须在语言层中再引入两个关键字,如C++ +代码>新< /代码>和<代码>删除< /代码>。这似乎没有明显的优势。至少就个人而言,我更喜欢德尔菲的方式


我必须加上一个假设:我们谈论的是真正的C++和德尔菲语言,因为它们大约在1995左右。它们只为堆分配的对象提供手动内存控制,没有垃圾收集,也没有自动引用计数。您无法通过使用nil/NULL指针分配变量来触发对象销毁。

这很可能是为了一致性。但我从来没有见过这样的场景,除了覆盖虚拟销毁之外,你还可以做任何事情。最后一段太过激烈了。它完全可以在没有关键字支持的情况下完成。更多的C++构造函数和析构函数被命名。所以我可以让类
CMyClass
具有构造函数
ABetterNameIKnow
?怎样?如果没有关键字和命名的构造函数,你会怎么做呢?该类的构造函数命名为CMyClass::CMyClass@DavidHeffernan,这意味着它们没有命名。命名是指我根据自己的选择命名。这正是那种命名,如
begin
while
关键字的命名。它们也是标识符,因此它们的命名与您的示例类似。它们的范围比CMyClass的范围要宽一些。我认为C++构造函数是命名的。如果它们没有命名,编译器如何知道如何找到它们。我们的谈话似乎有悖目的。我知道你的意思。我只是觉得你用的术语令人困惑。