c++中枚举数组的初始化

initialization of enum array in c++

本文关键字:初始化 数组 枚举 c++      更新时间:2023-10-16

我正在学习c++,并从一本书中做一些练习。我被要求写enum的定义,它需要3个值(向前,向后,停止)和这种类型的15个元素的数组。在这个定义中,我必须设置这个数组的前5个元素的值。我做得很顺利,但它让我思考……如果我写:

enum move {FORWARD = 1, BACKWARD, STOP};
move array[15] {FORWARD, BACKWARD, STOP, STOP, STOP};

…前5个元素的值分别是1、2、3、3,之后的都是0。既然"move"不能取1、2或3以外的值,这怎么可能呢?如果我只指定了前5个字段,为什么数组的其余部分要初始化?或者它只是意味着那些是空的?

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

每个枚举都有一个底层类型,并支持一个值范围。底层类型是一个大到足以存储整个值范围的整数类型。该范围内的所有整数都是枚举类型对象的有效值(见下文),即使没有包含该值的枚举器。0在任何枚举的值范围内,因此用0初始化枚举类型的对象是可以的。

如果整数值在该枚举所支持的值范围内,则可以将其转换为枚举的类型。

如果您使用大括号{..}初始化聚合(如数组),并且提供的初始化项少于聚合中的元素,则生成的元素将是value-initialized。对于基本类型(如int)和枚举类型,这意味着它们将从整数0初始化,转换为各自的类型。

move array[6] {FORWARD, BACKWARD, STOP, STOP, STOP};
// equivalent to:
move array[6] {FORWARD, BACKWARD, STOP, STOP, STOP, static_cast<move>(0)};

根据c++标准,如果具有非固定底层类型的枚举被定义为其最小值不为负的枚举数,则其最小值等于0。

在你的代码中,最小值的枚举数是FORWARD。它的值不是负的。因此,枚举的最小有效值为0。

考虑到根据相同的c++标准

可以定义一个枚举,该枚举的值不是由它的枚举数。

由于数组的初始化项少于数组中的元素,因此所有没有初始化项的元素都将进行零初始化。0是枚举的有效值。

您的enum move是与FORWARD = 1, BACKWARD = 2, STOP = 3显式创建的。

当你尝试初始化数组时,其余的值都是零,因为你必须给它们一个显式的值,否则它默认为零来填充数组。

数组不能有"空内存",也不能有部分初始化的数组。

也就是说,enum的值是int的抽象,因此必须初始化为整数。