在c ++中初始化enum数组

时间:2014-06-22 21:23:24

标签: c++ arrays enums initialization

我现在正在学习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个字段,为什么还要初始化数组的其余部分? 或许它只是意味着那些是空的?

请以简单的方式解释,这样初学者可以理解:),谢谢。

3 个答案:

答案 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的抽象,因此必须初始化为整数。