以下声明:
type
TRec = record
constructor Create;
end;
Run Code Online (Sandbox Code Playgroud)
产生此编译错误:
E2394记录类型不允许使用无参数构造函数
该文档相当无益地说明:
没有更多信息可用于此错误或警告.
我的问题是为什么语言是这样设计的.这样做是否纯粹是为了回应C#结构的类似限制?
该语种导游这样说:
使用默认的无参数构造函数自动构造记录,但必须显式构造类.由于记录具有默认的无参数构造函数,因此任何用户定义的记录构造函数都必须具有一个或多个参数.
但这没有多大意义.如果记录有默认构造函数,则无法通过RTTI找到它.即使有,为什么这意味着不可能添加另一个呢?您可以为课程这样做.
也许理由是,如果允许我们定义自己的无参数构造函数,我们希望编译器自动调用它们.
注意:我知道您可以使用无参数静态类函数作为变通方法.实际上,我个人总是喜欢使用静态类函数而不是记录构造函数.但这不是问题的关键.我真正想知道的是为什么不允许在记录类型上使用无参数构造函数.
我无法给你一个明确的答案(只有编译器构建者可以),但我怀疑这与 Delphi 的 .NET 过去无关,而是与 Delphi 与 C++Builder 的关系有关。
正如cppreference所说:
默认构造函数是可以不带参数调用的构造函数(使用空参数列表定义,或者为每个参数提供默认参数)。
C++ 允许无参数构造函数,并且这些无参数构造函数将成为 C++ 中的默认构造函数。在许多情况下都会调用默认构造函数,例如,如果您只是声明:
Foo myFoo;
Run Code Online (Sandbox Code Playgroud)
调用默认构造函数。这在 Delphi 中不会发生,但 C++ 程序员可能会想到它。同样,如果你这样做:
Foo elements[1000];
Run Code Online (Sandbox Code Playgroud)
每个元素都会调用默认构造函数(我检查过)。这在 Delphi 中也不会发生,尽管 C++ 程序员可能会期望如此。
其他与 C++ 相关的提示:
Init也不允许使用不同名称的构造函数(例如)。这似乎与 C++ 或 C# 存在冲突,因为在这两种情况下,构造函数都具有类或结构的名称,因此任何无参数构造函数都将映射到Foo()(在名为 的结构或类中Foo)。总而言之,有迹象表明无参数构造函数(或仅具有默认参数的构造函数)与 C++(即 C++Builder)冲突,这就是不允许使用它们的原因。
请注意,这并不是与 C++ 的差异造成的唯一限制:例如,在 Delphi 中,您也不能将整数转换为浮点类型或从浮点类型转换为整数,因为在 C 和 C++ 中,这会导致转换,而在 Delphi 中,它只会导致位的重新解释。为了不让从 C 或 C++ 转向 Delphi 的人感到困惑,对浮点类型进行了强制转换限制。可能还有更多。
| 归档时间: |
|
| 查看次数: |
741 次 |
| 最近记录: |