为什么默认的无参数构造函数在创建带有参数的构造函数时消失

2022-08-31 07:05:43

在 C# 中,C++和 Java,当您创建一个采用参数的构造函数时,默认的无参数构造函数将消失。我一直只是接受这个事实,但现在我开始想知道为什么。

这种行为的原因是什么?它只是一个“安全措施/猜测”说“如果你已经创建了自己的构造函数,你可能不希望这个隐含的构造函数徘徊”?或者它是否具有技术原因,使得编译器在您自己创建构造函数后无法添加一个?


答案 1

如果您添加了自己的构造函数,则编译器没有理由不能添加构造函数 - 编译器几乎可以做任何它想要做的事情!但是,您必须查看最有意义的内容:

  • 如果我没有为非静态类定义任何构造函数,我很可能希望能够实例化该类。为了允许这样做,编译器必须添加一个无参数构造函数,该构造函数除了允许实例化之外没有任何效果。这意味着我不必为了使其工作而在代码中包含空构造函数。
  • 如果我定义了自己的构造函数,特别是一个带有参数的构造函数,那么我很可能有自己的逻辑,必须在创建类时执行。在这种情况下,如果编译器要创建一个空的、无参数的构造函数,它将允许某人跳过我编写的逻辑,这可能会导致我的代码以多种方式中断。如果在这种情况下我想要一个默认的空构造函数,我需要明确地说出来。

因此,在每种情况下,您都可以看到当前编译器的行为在保留代码的可能意图方面最有意义。


答案 2

当然,没有技术原因为什么语言必须以这种方式设计。

我可以看到四个有点现实的选择:

  1. 根本没有默认构造函数
  2. 当前方案
  3. 默认情况下始终提供默认构造函数,但允许显式禁止显示该构造函数
  4. 始终提供默认构造函数,不允许将其禁止显示

选项 1 有点吸引人,因为我编码的次数越多,我真正想要无参数构造函数的频率就越低。有一天,我应该数一下我最终使用默认构造函数的频率......

选项2我很好。

对于语言的其余部分,选项 3 与 Java 和 C# 的流程背道而驰。你从来没有明确“删除”过任何东西,除非你明确地让事情比Java中的默认值更加私密。

选项4是可怕的 - 你绝对希望能够用某些参数强制建造。这是什么意思?new FileStream()

所以基本上,如果你接受提供默认构造函数是有意义的前提,我相信一旦你提供自己的构造函数就禁止它很有意义。


推荐