我现在正在学习c ++并从书中做一些练习。 我要求写enum的定义,它取3个值(前进,后退,停止)和15个此类元素的数组。在这个定义中,我必须设置此数组的前5个元素的值。我没有遇到任何问题,但它让我思考..如果我写:
enum move {FORWARD = 1, BACKWARD, STOP};
move array[15] {FORWARD, BACKWARD, STOP, STOP, STOP};
...前5个元素的值为1,2,3,3,3,但之后的所有元素都为0。 怎么可能因为"移动"不能取1,2或3以外的值? 如果我只指定了前5个字段,为什么还要初始化数组的其余部分? 或许它只是意味着那些是空的?
请以简单的方式解释,这样初学者可以理解:),谢谢。
答案 0 :(得分:2)
每个枚举都有一个基础类型,并支持一系列值。底层类型是一个足以存储整个值范围的整数类型。对于枚举类型的对象,该范围内的所有整数都是有效值(见下文),即使没有具有该值的枚举数也是如此。 0
在任何枚举的值范围内,因此使用0
初始化枚举类型的对象就可以了。
如果整数值在此枚举支持的值范围内,则可以将其转换为枚举的类型。
如果使用大括号{..}
初始化聚合(如数组)并提供的初始化程序少于聚合中的元素,则生成的元素将值初始化。对于基本类型(如int
)和枚举类型,这意味着它们将从整数0
初始化,转换为它们各自的类型。
move array[6] {FORWARD, BACKWARD, STOP, STOP, STOP};
// equivalent to:
move array[6] {FORWARD, BACKWARD, STOP, STOP, STOP, static_cast<move>(0)};
答案 1 :(得分:1)
根据C ++标准,具有非固定底层类型的枚举的最小值等于零,如果它们的定义方式使得它们的最小值的枚举器不是负的。
在您的代码中,最小值的枚举器为FORWARD
。它的价值不是负面的。因此枚举的最小有效值为0.
考虑到根据相同的C ++ Stsandard
可以定义具有未定义的值的枚举 任何一名普查员。
对于数组,因为它具有比数组中的元素少的初始化器,所以没有初始化器的所有元素将被零初始化。零是枚举的有效值。
答案 2 :(得分:0)
您的enum move
是使用FORWARD = 1, BACKWARD = 2, STOP = 3
明确创建的。
当您尝试初始化数组时,其余值为零,因为您必须为它们提供显式值,否则默认为零以填充数组。
没有&#34;空记忆&#34;在数组中,也不能有部分初始化的数组。
换句话说,enum
值是int
的抽象,因此必须初始化为整数。