【问题标题】:C++11: Default constructor: Implicit or Explicit? [closed]C++11:默认构造函数:隐式还是显式? [关闭]
【发布时间】:2016-12-04 15:22:40
【问题描述】:

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

现在认为写作不好

struct Foo {

};

应该写

struct Foo {

  Foo() = default;


};

?

【问题讨论】:

    标签: c++11 constructor default


    【解决方案1】:

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

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

    在您的示例中,不需要“显式”= default 构造函数。更多的是风格问题。

    【讨论】:

    • 谢谢,是的,在那种情况下,我理解它的好处。但是,如果我真的只有上面的 Foo 结构,那么现在认为省略 ctr 或更具体并将其声明为默认值会更清楚吗?
    【解决方案2】:

    here 所述,当您创建带参数的构造函数时,不会生成默认构造函数。在这些情况下,使用 default 关键字会为类生成 default constructor

    但是,请仔细考虑您正在处理的对象是否真的应该具有默认构造函数;也就是说,如果其他对象的默认初始化是正确的做法。请记住,POD 成员默认情况下不会初始化,并且可能包含没有data member initalisers 的垃圾数据。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-25
          • 2012-07-19
          相关资源
          最近更新 更多