C++ C+中POD类型的默认初始化+;

C++ C+中POD类型的默认初始化+;,c++,initialization,C++,Initialization,我知道有些变量是默认初始化的,但其他变量不是。(POD类型包括int、float、指针、并集、POD类型数组、POD类型结构等。) 作用域和存储类如何影响POD类型的默认初始化? 具体来说,以下哪项将被隐式初始化: 具有自动存储的局部变量 静态局部变量 静态全局变量 外部变量 使用new 类的POD成员(构造函数中没有显式初始化) 我知道存在一些与这些情况相关的问题,但没有一个是全面的(它们只针对特定情况)。如果我们只讨论POD,那么只有局部和全局静态和外部变量,因为它们必须在某个地方定义

我知道有些变量是默认初始化的,但其他变量不是。(POD类型包括
int
float
、指针、并集、POD类型数组、POD类型结构等。)

作用域和存储类如何影响POD类型的默认初始化?

具体来说,以下哪项将被隐式初始化:

  • 具有自动存储的局部变量
  • 静态局部变量
  • 静态全局变量
  • 外部变量
  • 使用
    new
  • 类的POD成员(构造函数中没有显式初始化)

我知道存在一些与这些情况相关的问题,但没有一个是全面的(它们只针对特定情况)。

如果我们只讨论POD,那么只有局部和全局静态外部变量,因为它们必须在某个地方定义

分配有
new
的POD也会初始化有时-如果您明确初始化:

int* x = new int();
将创建一个初始化为
0
x
指向它的
int
,而

int* x = new int;
将有
x
指向未初始化的
int

有时-POD类成员-它们可以显式初始化(不在构造函数中):


具有自动存储持续时间的本地变量不会自动初始化。由于使用未初始化的变量会产生未定义的行为,因此即使变量是冗余的,也可以显式初始化变量

关于零初始化的POD类型,C++03标准3.6.2非本地对象的初始化规定:

§1具有静态存储持续时间的对象(3.7.1)应在进行任何其他初始化之前进行零初始化。零初始化和带有常量表达式的初始化统称为静态初始化;所有其他初始化都是动态初始化。在进行任何动态初始化之前,应初始化POD类型(3.9)的对象(静态存储持续时间由常量表达式(5.19)初始化)

所以,标准保证具有静态存储持续时间(无论其范围是什么)的POD类型将初始化为零

类的POD成员(构造函数中没有显式初始化)

这种情况在12.6.2初始化基础和成员中进行了描述,说明(所选部分):

如果给定的非静态数据成员或基类不是由mem初始值设定项id命名的(包括由于构造函数没有ctor初始值设定项而没有mem初始值设定项列表的情况),则:

-如果实体是非静态数据成员…,并且实体类是非POD类,则实体是默认初始化的(8.5)

-否则,实体不会初始化

类X的构造函数调用完成后,如果构造函数的mem初始值设定项中未指定X的成员,也未初始化默认值,也未初始化值,也未在构造函数体的执行过程中指定值,该成员的值不确定。

例如:

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 !!!
}
C类
{
公众:
C(intx,intz):x(x),z(z){}
int x,y,z;
};
内部主(空)
{
C*C=新的C(1,3);
std::cout y;//y的值未确定!!!
}

你说的“修饰语”是什么意思?不要将
静态
存储类说明符与静态存储持续时间混淆,前者对初始化没有影响,后者有影响。是的,我指的是存储类。修正了。我对最后一种情况很好奇:如果有一个构造函数,但它没有初始化
x
。是否使用
x()
x
初始化为0?i、 e.如果有构造函数,是否需要初始化构造函数中的所有POD类型?@QuasarDonkey:检查我的答案,我在底部添加的示例。
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 !!!
}