结构中成员的默认值

时间:2015-05-31 04:48:17

标签: c++

在结构

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

A a;

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

2 个答案:

答案 0 :(得分:4)

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

  

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

在您的情况下,这意味着您的对象A a的每个成员都将归零,因此a.a将归零,然后构造函数A()将运行(这将不会任何东西)。在一天结束时,a.a将为零。

如果A a具有非静态/非线程存储持续时间(例如,在函数内部具有A a;),则不执行零初始化,并且构造函数再次不执行任何操作。因此,如果您尝试阅读a.a,则会有UB(未定义的行为),因为后者未被初始化。

答案 1 :(得分:2)

如果你已经使用过java,你可能会知道变量被分配了一个默认值,但在c ++中并非如此。在这里,您只为变量分配一块内存。无论它分配给你之前它包含的垃圾随之而来。所以我们称之为垃圾值。您必须在类或结构的构造函数中将其初始化为所需的值。