默认和零初始化

时间:2018-12-29 03:43:37

标签: c++

#include <string>
 
struct T1 { int mem; };
 
struct T2
{
    int mem;
    T2() { } // "mem" is not in the initializer list
};
 
int n; // static non-class, a two-phase initialization is done:
       // 1) zero initialization initializes n to zero
       // 2) default initialization does nothing, leaving n being zero
 
int main()
{
    int n;            // non-class, the value is indeterminate
    std::string s;    // class, calls default ctor, the value is "" (empty string)
    std::string a[2]; // array, default-initializes the elements, the value is {"", ""}
//  int& r;           // error: a reference
//  const int n;      // error: a const non-class
//  const T1 t1;      // error: const class with implicit default ctor
    T1 t1;            // class, calls implicit default ctor
    const T2 t2;      // const class, calls the user-provided default ctor
                      // t2.mem is default-initialized (to indeterminate value)
}

我目前正在查看参考指南,但是有一些我不理解的地方。

我已经运行了上面的代码,对于结构T2,数据成员“ int mem”不在初始化列表中。据说t2.mem是默认初始化为不确定的值。 但是当我运行这段代码时,t2.mem似乎对我初始化为零?

1 个答案:

答案 0 :(得分:4)

  

但是当我运行这段代码时,t2.mem似乎对我初始化为零?

否,在两种情况下(T1,T2),mem都未初始化,或未通过不确定的值初始化。在这种情况下,构造函数的显式声明不影响mem的初始化。如果要初始化mem,则必须在成员初始值设定项列表中明确地进行此操作:

struct T2
{
    int mem;
    T2() : mem(0) { }
};

或通过默认的成员初始化程序:

struct T1 { int mem = 0; };

或者通过T1的聚合初始化,只有在T1没有任何用户声明的构造函数的情况下才会发生。

struct T1 { int mem; }

int main() {
    T1 a{}; // aggregate initialization
    assert(a.mem == 0)

    T1 b; // default constructor does not value initialize mem
}

如果在第二种情况下看到mem0初始化,则这很可能是编译器的功能,或者您很幸运地获得了0的值。该标准不能保证,请不要依赖它。