显式默认构造函数和成员变量的初始化

3

当构造函数被显式地默认时,我有些困惑。

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

使用第一种选项是否有任何对 Y 的限制条件?

class X
{
public:
    X() = default;

private:
    Y m_y;
};

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

private:
    Y m_y;
};
2个回答

7

有两个可能的差异来源。

  1. X() = default; 不是用户提供的。 X() : m_y() {} 是。前者可以是平凡的; 后者永远不会是平凡的。此外,如果一个X对象被值初始化,它们的行为将有所不同。

  2. X() = default; 执行的初始化集与X() {}相同,后者默认初始化m_yX() : m_y() {} 值初始化m_y。根据Y的定义,这可能会有所不同。例如,如果Yint,则默认初始化将使其具有不确定的值,而值初始化将其设置为零。


0

一些细节需要依靠实现,例如int类型的零初始化......但严格来讲,默认构造函数与其他两个构造函数是一样的。尽管如此,我认为引入默认构造函数是必需的,以便让编译器在生成它时进行选择。如果默认构造函数不存在,即使未被使用,编译器也会被迫生成构造函数。这是关键所在,我的看法是如此。 - Mel Viso Martinez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接