C++ C+中POD类型的默认初始化+;
我知道有些变量是默认初始化的,但其他变量不是。(POD类型包括C++ C+中POD类型的默认初始化+;,c++,initialization,C++,Initialization,我知道有些变量是默认初始化的,但其他变量不是。(POD类型包括int、float、指针、并集、POD类型数组、POD类型结构等。) 作用域和存储类如何影响POD类型的默认初始化? 具体来说,以下哪项将被隐式初始化: 具有自动存储的局部变量 静态局部变量 静态全局变量 外部变量 使用new 类的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 !!!
}