gpt4 book ai didi

delphi - 为什么记录中不允许使用无参数构造函数?

转载 作者:行者123 更新时间:2023-12-03 14:39:05 25 4
gpt4 key购买 nike

以下声明:

type
TRec = record
constructor Create;
end;

产生此编译错误:

E2394 Parameterless constructors not allowed on record types

documentation相当无益的状态:

No further information is available for this error or warning.

我的问题是为什么该语言是这样设计的。这样做纯粹是为了echo the analogous restriction for C# structs吗? ?

language guide说的是:

Records are constructed automatically, using a default no-argument constructor, but classes must be explicitly constructed. Because records have a default no-argument constructor, any user-defined record constructor must have one or more parameters.

但这没有多大意义。如果记录有默认构造函数,则无法通过 RTTI 找到它。即使有,为什么会意味着不可能再添加一个呢?您可以在类里面这样做。

也许理由是,如果我们被允许定义自己的无参数构造函数,我们就会期望编译器自动调用它们。

注意:我知道您可以使用无参数静态类函数作为解决方法。事实上,我个人总是更喜欢使用静态类函数而不是记录构造函数。但这不是问题的重点。我真正想知道的是为什么记录类型不允许使用无参数构造函数。

最佳答案

我无法给你一个明确的答案(只有编译器构建者可以),但我怀疑这与 Delphi 的 .NET 过去无关,而是与 Delphi 与 C++Builder 的关系有关。

cppreference说:

A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).

C++ 允许无参数构造函数,并且这些无参数构造函数将成为 C++ 中的默认构造函数。在许多情况下都会调用默认构造函数,例如如果您只是声明:

Foo myFoo;

调用默认构造函数。这在 Delphi 中不会发生,但 C++ 程序员可能会想到它。同样,如果您这样做:

Foo elements[1000];

每个元素都会调用默认构造函数(我检查过)。这在 Delphi 中也不会发生,尽管 C++ 程序员可能会期望如此。

其他与 C++ 相关的提示:

  • 也不允许使用不同名称的构造函数(例如 Init)。这似乎与 C++ 或 C# 冲突,因为在这两种情况下,构造函数都具有类或结构的名称,因此任何无参数构造函数都将映射到 Foo() (在结构或类中)称为 Foo。)
  • 也不允许仅使用默认参数的构造函数。这与仅具有默认参数的默认构造函数的 cppreference 描述相匹配。

总而言之,有迹象表明无参数构造函数(或仅具有默认参数的构造函数)与 C++(即 C++Builder)冲突,这就是不允许使用它们的原因。

请注意,这并不是与 C++ 的差异造成的唯一限制:例如在 Delphi 中,您也不能将整数与浮点类型进行转换,因为在 C 和 C++ 中,这会导致转换,而在 Delphi 中,它只会导致位的重新解释。为了不让从 C 或 C++ 转向 Delphi 的人感到困惑,对浮点类型进行了强制转换限制。可能还有更多。

关于delphi - 为什么记录中不允许使用无参数构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46012021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com