Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 显式默认构造函数和成员变量的初始化_C++_C++11_Constructor_Default Constructor - Fatal编程技术网

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

C++ 显式默认构造函数和成员变量的初始化,c++,c++11,constructor,default-constructor,C++,C++11,Constructor,Default Constructor,我对显式默认一个ctor时会发生什么有点困惑 下面的两个代码示例是否等效 要使用第一个选项,Y是否有任何限制 class X { public: X() = default; private: Y m_y; }; class X { public: X() : m_y() {} private: Y m_y; }; 有相同的。有了明确的首席技术官,你只能强制执行他的创作。否则,如果不使用默认构造函数,编译器可以避免创建它。创建共享库时可能会很有趣。 参考有

我对显式默认一个ctor时会发生什么有点困惑

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

要使用第一个选项,
Y
是否有任何限制

class X
{
public:
    X() = default;

private:
    Y m_y;
};

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

private:
    Y m_y;
};

有相同的。有了明确的首席技术官,你只能强制执行他的创作。否则,如果不使用默认构造函数,编译器可以避免创建它。创建共享库时可能会很有趣。
参考

有两种可能的差异来源

  • X()=默认值不是用户提供的<代码>X():m_y(){}
    是。前者可能微不足道;后者绝不是微不足道的。此外,如果初始化了
    X
    对象的值,它们的行为也会有所不同

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


  • 一些细节必须依赖于实现,比如ints的零初始化。。。但严格来说,默认值与其他两个构造函数相同。尽管如此,我认为需要引入默认值,以便让编译器在生成它时进行选择。如果默认值不存在,编译器将被迫生成构造函数,即使没有使用。这就是关键。