局部变量和全局变量默认是如何初始化的?

2024-04-18

根据以下内容,我对吗?

  • global_A 引用被初始化为 null。
  • global_int 为 0
  • local_A 引用为空
  • local_int 未初始化
  • global_A.x 和 local_A.x 均未初始化。

谢谢你的帮助。


A global_A;
int global_int;

class A {
  public : int x;
}

int main()
{
  int local_int;
  A local_A;
}

以安德烈的回应为基础。

$3.6.2-“具有静态存储持续时间(3.7.1)的对象应在任何其他初始化发生之前进行零初始化(8.5)。”。在OP中,“global_A”和“global_int”具有静态存储持续时间。 “local_int”和“local_A”没有链接,因为它们是本地对象。

$8.5/5- 对 T 类型的对象进行零初始化意味着:

— 如果 T 是标量类型 (3.9),则 对象的值设置为 0(零) 转换为T;

— 如果 T 是非联合类类型,则每个 非静态数据成员和每个 基类子对象是 零初始化;

— 如果 T 是联合类型,则该对象的 第一个命名数据成员89) 是 零初始化;

— 如果 T 是数组类型,则每个元素 是零初始化的;

— 如果 T 是引用类型,则否 执行初始化。

$6.7.4/4-“所有具有静态存储持续时间(3.7.1)的本地对象的零初始化(8.5)在任何其他初始化发生之前执行。具有静态存储持续时间的POD类型(3.9)的本地对象已初始化with 常量表达式在首次进入其块之前初始化。允许执行 在允许实现静态初始化命名空间范围内具有静态存储持续时间的对象的相同条件下,早期初始化具有静态存储持续时间的其他本地对象(3.6.2)。否则,这样的对象将在控制第一次通过其声明时被初始化;这样的对象在其初始化完成后就被视为已初始化。如果初始化通过抛出异常退出,则初始化尚未完成,因此下次控制进入声明时将再次尝试。如果在初始化对象时控制重新进入声明(递归地),则行为是未定义的。”

EDIT 2:

$8.5/9-“如果没有初始化器 为一个对象指定,并且 对象属于(可能符合简历要求) 非 POD 类类型(或其数组), 该对象应是 默认初始化;如果该物体是 属于 const 限定类型, 底层类类型应具有 用户声明的默认构造函数。否则,如果没有为非静态对象指定初始值设定项,则 对象及其子对象(如果有), 有一个不确定的初始值 值90);如果该对象或任何 它的子对象是 const 限定的 类型,该程序格式错误。”

一般来说,您需要花费 8.5 美元来阅读这些部分,以便更好地掌握这方面的知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

局部变量和全局变量默认是如何初始化的? 的相关文章

随机推荐