c++中枚举数组的初始化
initialization of enum array in c++
我正在学习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
的抽象,因此必须初始化为整数。
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组