结构体中成员的默认值
Default value of members in a struct
结构体
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++中不是这样。在这里,您只为变量分配了一块内存。它在分配给您之前包含的任何垃圾都伴随着它。所以我们称它为垃圾值。您必须在类或结构的构造函数中将其初始化为您想要的值。
相关文章:
- 为什么在使用指针时不采用类成员的默认值,而不是直接实例化对象时?
- C++中未初始化成员布尔变量的默认值是多少?
- C++11 默认类成员初始化与初始值设定项列表同时
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 使用默认值初始化成员引用
- 模板类专业化具有成员变量和方法的默认值
- 初始化类成员 - 默认值还是成员初始化列表?
- 具有类成员默认值的 C++11 默认构造函数行为
- 受保护成员 c++ 的默认值
- 成员属性作为方法的默认值
- Corba IDL:结构成员的默认值
- 结构成员的默认值
- 为向量成员和更新元素指定默认值
- 基本成员初始化与在类声明中指定默认值
- 类内定义的静态结构的静态成员的编译时默认值
- 使用类函数中的类数据成员作为默认值 c++
- boost::绑定具有默认值的成员函数
- 如何将未知类型的数据成员初始化为默认值
- 为引用成员变量提供默认值
- 我可以为模板成员函数提供几个默认值吗