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