Qua*_*key 13 c++ initialization pod
我知道默认情况下会初始化一些POD变量,但其他变量不是.(POD类型包括int
,float
指针,联合,POD类型的数组,POD类型的结构等)
范围和存储类如何影响POD类型的默认初始化?
具体而言,将隐式初始化以下哪项:
new
我知道存在一些与这些情况有关的问题,但没有全面的问题(它们只涉及具体情况).
Lih*_*ihO 16
具有自动存储持续时间的局部变量不会自动初始化.由于使用未初始化的变量会产生未定义的行为,因此即使多余的变量显式初始化变量也是一种好习惯.
关于零初始化的POD类型,C++ 03标准3.6.2非本地对象的初始化状态:
§1具有静态存储持续时间(3.7.1)的对象应在任何其他初始化发生之前进行零初始化(8.5).使用常量表达式进行零初始化和初始化统称为静态初始化; 所有其他初始化是动态初始化.具有使用常量表达式(5.19)初始化的静态存储持续时间的POD类型(3.9)的对象应在任何动态初始化发生之前初始化.
因此,标准保证具有静态存储持续时间(无论其范围是什么)的POD类型将被零初始化.
类的POD成员(没有在构造函数中显式初始化)
这种情况在12.6.2初始化基础和成员中描述,其中指出(选定的部分):
如果给定的非静态数据成员或基类没有由mem-initializer-id命名(包括没有mem-initializer-list的情况,因为构造函数没有ctor-initializer),那么:
- 如果实体是非静态数据成员 ...,并且实体类是非POD类,则实体默认初始化(8.5)...
- 否则,实体未初始化 ...
在完成对类X的构造函数的调用之后,如果X的成员既没有在构造函数的mem-initializers中指定,也没有在default-initialized中指定,也没有在value-initialized中指定,也没有在构造函数体的执行期间给出值,该成员具有不确定的价值.
例:
class C
{
public:
C(int x, int z) : x(x), z(z) { }
int x, y, z;
};
int main(void)
{
C* c = new C(1,3);
std::cout << c->y; // value of y is undetermined !!!
}
Run Code Online (Sandbox Code Playgroud)
如果我们只讨论POD,那么只有局部和全局静态和外部变量,因为它们必须在某处定义.
分配的POD new
有时也会初始化- 如果您明确初始化:
int* x = new int();
Run Code Online (Sandbox Code Playgroud)
将创建一个int
初始化为0
具有x
指向它,而
int* x = new int;
Run Code Online (Sandbox Code Playgroud)
将x
指向一个未初始化的int
.
有时 - POD类成员 - 它们可以显式初始化(不在构造函数中):
struct X
{
int x;
};
X x; //x.x is not initialized
X y = X(); //y.x is 0
Run Code Online (Sandbox Code Playgroud)