【问题标题】:initialization of enum array in c++在 C++ 中初始化枚举数组
【发布时间】:2014-06-22 21:23:24
【问题描述】:

我现在正在学习 c++ 并从书中做一些练习。 我被要求编写枚举的定义,它需要 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 个字段,为什么还要初始化数组的其余部分? 或者它只是意味着那些是空字段?

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

【问题讨论】:

  • 首先不要使用 move 作为enum 的名称。
  • C++中没有empty fieldempty memory area这样的东西。三是初始化和未初始化。对于指针,还有 NULL(或者,等效地,nullptr)。
  • @40two,这就是命名空间的用途,对吧?试图避免标准库使用的每一个标识符都是浪费时间,除非存在冲突的实际风险,这实际上应该只发生在你公开某些东西并且愚蠢的用户使用两个库的指令的库中。
  • @ddur,未检查枚举的有效值。这意味着为某些人不使用的东西付费。
  • 我现在明白了。感谢所有答案。

标签: c++ arrays enums initialization


【解决方案1】:

每个枚举都有一个基础类型,并支持一系列值。底层类型是一个足够大的整数类型,可以存储整个值范围。该范围内的所有整数都是枚举类型对象的有效值(见下文),即使没有具有该值的枚举数。 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)};

【讨论】:

【解决方案2】:

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

在您的代码中,具有最小值的枚举数是FORWARD。它的值不是负数。所以枚举的最小有效值为0。

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

可以定义具有未定义值的枚举 它的任何枚举数。

对于数组,因为它的初始化器比数组中的元素少,所以所有没有初始化器的元素都将被初始化为零。零是枚举的有效值。

【讨论】:

    【解决方案3】:

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

    当您尝试初始化数组时,其余值为零,因为您必须给它们一个明确的值,否则它默认为零以填充数组。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-31
      • 2011-10-21
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多