结构体中成员的默认值

Default value of members in a struct

本文关键字:默认值 成员 结构体      更新时间:2023-10-16

结构体

struct A
{
    int a;
    A(){ }
};
A a;

是否指定哪个值有a.a ?如果我们尝试读取a.a,我们是否有UB ?

如果A a;具有静态存储持续时间(如在main()之外定义),或线程存储持续时间(即在c++ 11或更高版本中使用thread_local定义),则a是零初始化的(感谢@Praetorian的评论)

3.6.2/2 [basic.start。具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量应在进行任何其他初始化之前进行零初始化(8.5)。

在你的例子中,这意味着你的对象A a的每个成员将被归零,因此a.a将被归零,然后构造函数A()将运行(它不会做任何事情)。在一天结束时,a.a将为零。

如果A a具有非静态/非线程存储持续时间(例如将A a;置于函数中),则不执行零初始化,构造函数也不做任何事情。所以你有UB(未定义行为),如果你试图读取a.a,因为后者是未初始化的。

如果你使用过java,你可能知道变量在java中被分配一个默认值,但在c++中不是这样。在这里,您只为变量分配了一块内存。它在分配给您之前包含的任何垃圾都伴随着它。所以我们称它为垃圾值。您必须在类或结构的构造函数中将其初始化为您想要的值。