我对类数据成员的默认初始化感到困惑.这是示例代码.
#include#include class A { public: int i; A() {} }; A a1; A aa1[3]; std::vector av1(3); int main() { A a2; A aa2[3]; std::vector av2(3); std::cout << a1.i << " " << a2.i << std::endl; // 0 undefined std::cout << aa1[0].i << " " << aa2[0].i << std::endl; // 0 undefined std::cout << av1[0].i << " " << av2[0].i << std::endl; // undefined undefined }
在上面的代码中,只有a1.i
和aa1[0~2].i
被初始化为0,而其他的是未初始化的.我不知道为什么会这样.
具体来说,我已经知道的是(来自"C++ Primer"):
初始化过程是:
a1
并且a2
被默认初始化.
的每一个元素aa1
,并aa2
在默认情况下初始化.
每个元素av1
和值av2
都被初始化了.
默认初始化的过程是:
检查变量是内置类型还是类类型.
对于内置类型,如果变量在任何函数体外,则将其初始化为0,否则该值未定义.
对于类类型,如果类具有默认ctor,则调用它,否则它是编译错误.
值初始化的过程是:
检查变量是内置类型还是类类型.
对于内置类型,它被初始化为0.
对于类类型,它是默认初始化的.(我认为这意味着如果该类具有默认的ctor,则调用它,否则它是编译错误.)
因此,当A::A()
调用ctor时,数据成员如何A::i
初始化(我猜它是默认初始化的)?为什么只有a1.i
和aa1[0~2].i
被初始化为0,而其他人是未初始化的?