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 除非默认操作必须 delete
ed.
如果您提供显式的非默认构造函数,您将不会获得默认提供的编译器。在这种情况下,您可以使用 default 关键字来强制编译器提供它。
另一种情况是,如果您想确保您的默认构造函数具有特定的保护级别。例如,您可能希望确保您的默认构造函数是私有的或受保护的。
我什么时候应该在 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 除非默认操作必须 delete
ed.
如果您提供显式的非默认构造函数,您将不会获得默认提供的编译器。在这种情况下,您可以使用 default 关键字来强制编译器提供它。
另一种情况是,如果您想确保您的默认构造函数具有特定的保护级别。例如,您可能希望确保您的默认构造函数是私有的或受保护的。