传统的枚举类型:
枚举类型在C语言中经常使用到的。语法: enum 类型名 {枚举常量};
但是,C语言中的枚举类型存在一定的缺陷
#include <stdio.h>
#include <stdlib.h>
// 定义枚举类型
typedef enum _NUMBER { ONE, TWO, THREE, FOUR, FIVE }NUB;
int main(void) {
// 使用枚举类型进行定义变量
NUB n = ONE; // 定义枚举的量
n = 2; // 在C语言程序中可以直接将数字赋值给枚举变量
n = 5;
system("pause");
return 0;
}
代码分析:
1. 代码中我们定义了一个枚举的常量n,我们可以使用声明的枚举常量给它赋值,这样当然没有什么问题。
2. 但是,代码中我们除了1中的赋值方式,还可以直接使用数字对n进行赋值。 这就会出现问题。
3. 因为我们在枚举中定义的枚举常量其实本质就是数字,所以说给枚举定义的量赋值给数字是没有问题的。
4. 那么问题出现在哪里?
其实很简单, 代码中ONE -> 0, TWO -> 1, THREE -> 2, FOUR -> 3, FIVE -> 4。你会发现我们定义的枚举常量范围是0-4。
如果我们使用常量的名称去赋值n自然不会出问题,因为名称只定义了那么几个。如果使用数字去赋值给n,就会出现问题了,使用数字赋值的时候,是没有限定的,我们很容易就赋值给超出枚举常量的范围之外的数字。
如代码中,我们将5赋值给n不会出现问题,但是5已经超出了我们定义的范围。
之所以不出现问题,是因为枚举其实说白了就是整数,你将一个只能整数赋值给它编译器不会认为是错误的。
为了防止上面的错误,c++提供了新的枚举类型,这种枚举类型将我们定义的常量与数字分割开了。
c++新增的枚举类型
其实就是定义成一个类了,语法: enum class _NUM{ONE,TWO,THREE};
代码分析:
1. 上面就使用了c++新增的枚举,我们前面说到了这个枚举并不与数字互通,也就是说我们不能直接将数字赋值给枚举定义的量,而且不能与数字进行比较。(也就是这种情况下,枚举常量和数字是不互通的) ,这就解决了之前的问题
2. 要想使用新增的枚举常量需要在常量前面加上类的名称,例如,代码中想要使用ONE,就得是_NUMBER::ONE,无论是赋值还是使用都需要这样使用。
3. 虽然枚举常量不与数字互通,但是我们可以对它进行类型强转。 例如: (int)_NUMBER::ONE其实就是0。代码中我们在数字比较的时候使用到了类型强制转换。