概述
目录
声明和定义
常规使用方法
自定义枚举量的值
枚举的取值范围(一般不用考虑)
枚举应用
改进后的枚举
原有枚举的问题
改进--强类型枚举
项目中的强类型枚举代码片段
参考
声明和定义
enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
这句话有两个作用:
第一:声明enumType为新的数据类型,称为枚举(enumeration);
第二:声明Monday、Tuesday等为符号常量,通常称之为枚举量,其值默认分别为0-6。(后面会介绍怎样显式的初始化枚举量的值)这些符号常量只能与整形进行类型转换。
常规使用方法
enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
enumType Weekday;
//或者在初始化的时候进行申明
//enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday;
在不进行强制转换的前提下,
只能将定义的枚举量赋值给该种枚举的变量,如:Weekday = Monday;或者Weekday = Sunday;
不能将其他值赋给枚举变量,如:Weekday = 10;这是不允许的,因为10不是枚举量。
在允许使用强制转换的前提下,
Weekday = enumType(2);等同于:Weekday = Wednesday;但有一点需要注意,如果你使用Weekday = enumType(20);结果将是不确定的,这么做不会出错,但得不到想要的结果。
问题:
(1)那枚举变量能不能进行算术运算呢?
如:int a=Monday;这是允许的,因为枚举量是符号常量,这里的赋值编译器会自动把枚举量转换为int类型。
(2)那枚举变量能不能进行算术运算呢?
Weekday++;Weekday = Monday + Tuesday;这是非法的,因为这些操作可能导致违反类型限制。反正就是C++没有定义这种算术运算符的操作。
(3)那么枚举量能不能参与其他类型变量的运算呢?
int a;a = 1 + Monday;这是允许的,因为编译器会自动把枚举量转换为int类型。
总结:对于枚举,只定义了赋值运算符,没有为枚举定义算术运算。
自定义枚举量的值
(1)前面讲通过定义enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
枚举量Monday、Tuesday等的值默认分别为0-6,我们可以显式的设置枚举量的值:
enum enumType {Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7};
指定的值必须是整数!
(2)也可以只显式的定义一部分枚举量的值:
enum enumType {Monday=1, Tuesday, Wednesday=1, Thursday, Friday, Saturday, Sunday};这样Monday、Wednesday均被定义为1,则Tuesday=2,Thursday、Friday、Saturday、Sunday的值默认分别为2、3、4、5。
总结:未被初始化的枚举值的值默认将比其前面的枚举值大1,枚举量的值可以相同。
枚举的取值范围(一般不用考虑)
前面讲到可以通过强制转换将其他类型值赋给枚举变量:Weekday = enumType(2);这是合法的;但是Weekday = enumType(20);是非法的。这里涉及枚举取值范围的概念:枚举的上限是 大于最大枚举量的 最小的2的幂,减去1;
枚举的下限有两种情况:一、枚举量的最小值不小于0,则枚举下限取0;二、枚举量的最小值小于0,则枚举下限是 小于最小枚举量的 最大的2的幂,加上1。
举例来讲:
假如定义 enum enumType1 { First=-5,Second=14,Third=10 };则枚举的上限是16-1=15(16大于最大枚举量14,且为2的幂); 枚举的下限是-8+1=-7(-8小于最小枚举量-5,且为2的幂);
枚举应用
个人觉得枚举和switch是最好的搭档:
enum enumType{Step0, Step1, Step2}Step=Step0;//注意这里在声明枚举的时候直接定义了枚举变量Step,并初始化为Step0
switch (Step)
{
case Step0:{...;break;}
case Step1:{...;break;}
case Step2:{...;break;}
default:break;
}
另外枚举还有一种少见的用法是 enum { one ,two ,three}; 就是不指定一个名字,这样我们自然也没法去定义一些枚举类型了。此时就相当于static const int one = 0;这样定义三个常量一样。然后用的话就是int no = one。
改进后的枚举
原有枚举的问题
强类型枚举(Strongly-typed enums),号称枚举类型,是C++11中的新语法,用以解决传统C++枚举类型存在的缺陷:
(1)传统C++中枚举常量被暴漏在外层作用域中,这样若是同一作用域下有两个不同的枚举类型,但含有相同的枚举常量也是不可的,比如:
enum Side{Right,Left};
enum Thing{Wrong,Right};
这是不能一起用的。
(2)另外一个缺陷是传统枚举值总是被隐式转换为整形,用户无法自定义类型。C++11中的强类型枚举解决了这些问题。
改进--强类型枚举
强类型枚举使用enum class语法来声明,如下:
enum class Enumeration{
VAL1,
VAL2,
VAL3=100,
VAL4
};
这样,枚举类型时安全的,枚举值也不会被隐式转换为整数,无法和整数数值比较,比如(Enumeration::VAL4==10会触发编译错误),就算Enumeration::VAL3==100也是编译不通过,毕竟类型不一样,你怎么比较。
另外枚举类型所使用的类型默认为int类型,也可指定其他类型,比如:
enum class Enum:unsigned int{VAL1,VAL2};
正如前面所说,强类型枚举能解决传统枚举不同枚举类下同枚举值名的问题,使用枚举类型的枚举名时,必须指明所属范围,比如:Enum::VAL1,而单独的VAL1则不再具有意义。
还有一点值得说明的是C++11中枚举类型的前置声明也是可行的,比如:
enum class Enum;
enum class Enum1:unsigned int;
我能想到的小例子:
例一
enum class Mytest { Step0, Step1, Step2 }Step;
int main()
{
Step = Mytest::Step0;
switch (Step)
{
case Mytest::Step0: {printf("Step0n"); break; }
case Mytest::Step1: {printf("Step1n"); break; }
case Mytest::Step2: {printf("Step2n"); break; }
default:break;
}
return 0;
}
结果为:
Step0
例二
enum class Enum:unsigned int { VAL1, VAL2 };
int main()
{
Enumeration x = Enumeration::VAL3;
Enum p = Enum::VAL1;
int q = (int)p;
cout << q << endl;
return 0;
}
结果为:
0
项目中的强类型枚举代码片段
1、图像处理
enum class Color{RED,BLUE,YELLOR,BLACK,WHITE};
2.交通灯
enum class TrafficLight{RED,YELLOR,GREEN};
强类型枚举值具有传统枚举的功能——命名枚举值,同时又具有类的特点——具有类域的成员和无法进行默认的类型转换。所以也称之为枚举类——enmu class
枚举类的底层数据必须是有符号或无符号整型,比如char unsigned int unsigned long,默认为int。
3.前置声明应用
enmu class Color:char; //前置声明枚举类
void Foo(Color*p); //前置声明的使用
//....................
enum class Color:char{RED,GREEN,BLACK,WHITE}; //前置声明的定义
参考
https://blog.csdn.net/bruce_0712/article/details/54984371
https://www.cnblogs.com/byteHuang/p/7092010.html(原有enum枚举的例子)
最后
以上就是明理小鸽子为你收集整理的【C++】枚举(enum)的全部内容,希望文章能够帮你解决【C++】枚举(enum)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复