可以接受对象构造函数的"双重调用"

Joh*_*hny 2 delphi delphi-2010

令我惊讶的是,我发现对象的构造函数的"双重调用"是编译器可以接受的.知道这个用途的目的是什么,这个功能的结果是什么?

procedure TForm1.Button1Click(Sender: TObject);
var
  vLabel : Tlabel;
begin
  vLabel := Tlabel.Create(self).Create(self);
end;
Run Code Online (Sandbox Code Playgroud)

Fre*_*man 5

第二次调用Create就像常规过程调用一样:它省略了任何特殊的构造代码,只在构造函数中执行用户代码.在实践中,这对于能够从构造函数的实现中调用其他构造函数非常有用:

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

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

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