【问题标题】:Explicitly defaulted constructors and initialisation of member variables显式默认构造函数和成员变量的初始化
【发布时间】:2015-06-21 04:55:01
【问题描述】:

我对明确默认 ctor 时会发生什么感到有些困惑。

下面的两个代码示例是否等效?

Y 是否有任何限制才能使用第一个选项?

class X
{
public:
    X() = default;

private:
    Y m_y;
};

class X
{
public:
    X() : m_y() {}

private:
    Y m_y;
};

【问题讨论】:

    标签: c++ c++11 constructor default-constructor


    【解决方案1】:

    有两种可能的差异来源。

    1. X() = default; 不是用户提供的X() : m_y() {} 是。前者可以是微不足道的;后者绝不是微不足道的。此外,如果 X 对象是值初始化的,它们的行为也会有所不同。

    2. X() = default; 执行的初始化集等同于X() {}默认初始化m_yX() : m_y() {} 值初始化 m_y。根据Y 是什么,这可能会有所不同。例如,如果Yint,则默认初始化会将其保留为不确定的值,而值初始化会将其设置为零。

    【讨论】:

      【解决方案2】:

      有相同的。使用明确的 cto'rs,您只能强制执行他的创建。否则,如果您不使用默认构造函数,编译器可以避免创建它。创建共享库时可能会很有趣。 供参考http://en.cppreference.com/w/cpp/language/default_constructor

      【讨论】:

      • 一些细节必须依赖于实现,比如int的零初始化……但严格来说,默认与其他两个构造函数相同。尽管如此,我认为需要引入默认值才能让编译器在生成它时进行选择。如果默认不存在,即使不使用,编译器也会强制生成构造函数。这就是关键。
      猜你喜欢
      • 2015-07-03
      • 2015-10-07
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多