delphi - 对象构造函数的 "double call"是可以接受的

标签 delphi delphi-2010

令我惊讶的是,我发现编译器可以接受对对象构造函数的“双重调用”。知道这个函数的目的是什么以及这样的函数会产生什么结果吗?

procedure TForm1.Button1Click(Sender: TObject);
var
  vLabel : Tlabel;
begin
  vLabel := Tlabel.Create(self).Create(self);
end;

最佳答案

Create 的第二次调用与常规过程调用类似:它省略任何特殊的构造代码,仅执行构造函数中的用户代码。实际上,这对于能够从构造函数的实现调用其他构造函数非常有用:

constructor TLabel.CreateHello(AOwner: TComponent);
begin
  // Perform default construction.
  Create(AOwner);
  // Set default text.
  Caption := 'Hello';
end;

将此与 C++ 进行比较,在 C++ 中,您必须将多个构造函数的共享逻辑移至单独的函数,因为一旦创建对象就无法调用构造函数。 Delphi 解决方案非常优雅,并且鼓励代码重用。

为了实现这一点,构造函数有一个隐藏的额外 bool 参数,用于指定是否执行完整的构造逻辑(例如内存分配)。

关于delphi - 对象构造函数的 "double call"是可以接受的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20997736/

相关文章:

delphi - SQL Server 2005 查询在 SQL Server Management Studio Express 中有效,但在 Delphi 2010 中无效

delphi - 无法找到组件

delphi - E2010 不兼容类型 : 'LPQUERY_SERVICE_CONFIGW' and 'PQueryServiceConfigA' error in Delphi XE4

delphi - 在 Delphi 的 Unicode 版本中 Access 记录的真实缓冲区 - ADO

jquery - 如何使用 jQuery 和 "Long Polling"通过 Indy HTTP 服务器动态更新 HTML 页面?

android - Delphi RX 中 Android 服务中的 IdHTTP

delphi - 如何在不使用 alClient 对齐的情况下调整 TGridPanel 内 TEdit 的大小

delphi - 如何在 Delphi 2010 中禁用格式化程序

delphi - 循环复杂度-Delphi API

delphi - 如何从项目中查找并删除未使用的 Delphi 包