【发布时间】:2016-03-27 04:23:58
【问题描述】:
我对类数据成员的默认初始化感到困惑。这是示例代码。
#include <iostream>
#include <vector>
class A {
public:
int i;
A() {}
};
A a1;
A aa1[3];
std::vector<A> av1(3);
int main()
{
A a2;
A aa2[3];
std::vector<A> 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,则调用它,否则它是编译错误。)
那么当调用ctorA::A()时,数据成员A::i是如何初始化的(我猜是默认初始化的)?还有为什么只有a1.i和aa1[0~2].i被初始化为0,而其他的都未初始化?
【问题讨论】:
-
您不能从输出 0 得出变量已“初始化为 0”的结论。它可能未初始化并且该内存位置恰好包含
0。更重要的是,输出未初始化的变量会导致整个程序具有未定义的行为,因此您无法从输出中真正得出任何可靠的结论。