如果所有对象都至少有一个构造函数,无论是由编译器定义的默认构造函数还是用户定义的构造函数,那么对象如何未初始化。
对类型T进行默认初始化的含义如下:
(7.1) — 如果T是(可能带有cv限定符的)类类型(第12节),则考虑构造函数。逐个枚举适用的构造函数(第16.3.1.3节),并通过重载解析(第16.3节)选择最佳的初始化程序 ()。然后使用空参数列表调用所选的构造函数以初始化对象。
(7.2) — 如果T是数组类型,则每个元素都进行默认初始化。
(7.3) — 否则,不执行任何初始化。
然而,静态对象总是零初始化。因此,具有动态或自动存储期限的任何内置对象可能不会初始化,即使它是子对象。int i; //zero-initialized
struct A{
int i;
};
struct B
{
B(){};
B(int i)
:i{i}{}
int i;
int j;
};
A a; //a.i is zero-initialized
int main()
{
int j; //not initialized
int k{}; //zero-initialized
A b; //b.i not initialized
int* p = new int; //*p not initialized
A* q = new A; //q->i not initialized
B ab; //ab.i and ab.j not initialized
B ab2{1}; //ab.j not initialized
int xx[10]; //xx's element not initialized.
int l = i; //OK l==0;
int m = j; //undefined behavior (because j is not initialized)
int n = b.i; //undefined behavior
int o = *p; //undefined behavior
int w = q->i; //undefined behavior
int ex = x[0] //undefined behavior
}
int x;
没有初始化,但是 int x[10];
是零初始化的吗?这似乎不太对,你有没有漏掉其他条款? - Mark Ransom类型为T
的对象的生命周期从以下情况开始:
获得适当对齐和大小以容纳类型T
的存储空间;
如果对象具有非平凡初始化,则其初始化完成。
如果对象是类或聚合类型,并且它或它的子对象之一由除了平凡默认构造函数之外的构造函数初始化,则称该对象具有非平凡初始化。
我们可以得出结论:对于具有空初始值(例如int
)的对象,它们的“生命周期”从获取存储空间开始,即使它们未被初始化。void foo()
{
int i; // i's lifetime begins after this line, but i is uninitialized
// ...
}
alignas(alignof(Mat4)) uint8_t result[sizeof(Mat4)];
// ..
node->updateMatrix( ..., /*result*/ reinterprect_cast<Mat4*>(&result[0]));
Mat4
的构造函数不会触发。
int
。 - NathanOliverint n;
),“默认初始化意味着不执行初始化”,因此它被初始化了,但又没有被初始化。 - juanchopanzaint i;
时,i
会被_默认初始化_。但是对于int
类型的_默认初始化_的定义是_"不执行任何初始化"_。通俗地说,我们只是称之为未被初始化。 - Passer By