在结构
中struct A
{
int a;
A(){ }
};
A a;
是否指定哪个值为a.a
?如果我们尝试阅读a.a
,我们有UB吗?
答案 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 ++中并非如此。在这里,您只为变量分配一块内存。无论它分配给你之前它包含的垃圾随之而来。所以我们称之为垃圾值。您必须在类或结构的构造函数中将其初始化为所需的值。