C++11:默认构造函数:隐式还是显式?

C++11: Default constructor: Implicit or Explicit?

我什么时候应该在 C++11 中使用 default 关键字?

现在是不是写的不好

struct Foo {

};

应该写

struct Foo {

  Foo() = default;


};

?

想一想 default constructor 由编译器提供的情况。然后你可以使用 = default 告诉编译器无论如何为你创建一个默认构造函数。

否则(除非您需要特殊的默认构造函数)没有理由以任何方式指定默认构造函数(有或没有 = default)。

在您的示例中,不需要 "explicit" = default 构造函数。这更多是风格问题。

如前所述 here, a default constructor is not generated when you create a constructor with arguments. In those cases, using the default keyword generates the default constructor 为 class。

但是,请仔细考虑您正在处理的对象是否真的应该有一个默认构造函数;也就是说,如果其他对象的默认初始化是正确的事情。请记住 POD members are not initalised by default and may contain garbage data without data member initalisers.

这似乎是一个基于意见的问题。然而,似乎第一个选项是最常用的,因为第二个选项更冗长,程序员往往不使用 default 除非默认操作必须 deleteed.

如果您提供显式的非默认构造函数,您将不会获得默认提供的编译器。在这种情况下,您可以使用 default 关键字来强制编译器提供它。

另一种情况是,如果您想确保您的默认构造函数具有特定的保护级别。例如,您可能希望确保您的默认构造函数是私有的或受保护的。