#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似乎对我初始化为零?
答案 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
}
如果在第二种情况下看到mem
由0
初始化,则这很可能是编译器的功能,或者您很幸运地获得了0
的值。该标准不能保证,请不要依赖它。