当构造函数被显式地默认时,我有些困惑。
下面的两个代码示例是否等效?
使用第一种选项是否有任何对 Y
的限制条件?
class X
{
public:
X() = default;
private:
Y m_y;
};
class X
{
public:
X() : m_y() {}
private:
Y m_y;
};
当构造函数被显式地默认时,我有些困惑。
下面的两个代码示例是否等效?
使用第一种选项是否有任何对 Y
的限制条件?
class X
{
public:
X() = default;
private:
Y m_y;
};
class X
{
public:
X() : m_y() {}
private:
Y m_y;
};
有两个可能的差异来源。
X() = default;
不是用户提供的。 X() : m_y() {}
是。前者可以是平凡的; 后者永远不会是平凡的。此外,如果一个X
对象被值初始化,它们的行为将有所不同。
X() = default;
执行的初始化集与X() {}
相同,后者默认初始化m_y
。 X() : m_y() {}
值初始化m_y
。根据Y
的定义,这可能会有所不同。例如,如果Y
是int
,则默认初始化将使其具有不确定的值,而值初始化将其设置为零。
它们是相同的。使用显式构造函数只会强制创建对象。否则,如果未使用默认构造函数,则编译器可以避免创建它。在创建共享库时可能会很有用。 参考链接 http://en.cppreference.com/w/cpp/language/default_constructor