枚举enum
枚举相当于宏定义一般,可以用来替代const或#define,但是枚举存在变量,数值可以修改。以下通过实例作简要介绍:
eg:
enum week_Days { Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
两点说明:
一、week_Days是一个新类型名,即TypeName,可以用于创建枚举变量;
二、花括号里边的是 枚举常量,对应整数值默认为“0,1,2,3,4,5,6”类似数组下标。
也就是指“Sunday”与“0”等价,“Monday”与“1”等价,“Tuesday”与“2”等价……
不过枚举常量的数值是可以用户自定义设置的,进而修改枚举的取值范围,如:
enum week_Days { Sunday,Monday,Tuesday=10,Wednesday,Thursday,Friday=1,Saturday};
那么对应整数值则为“0,1,10,11,12,1,2”。
枚举常量的数值大小原则:
第一个枚举常量未被初始化时,其数值为0;
其它未被初始化的枚举常量,其数值比前一个枚举常量大1。
易错警示:
枚举类型的变量的运算符有且仅有 赋值运算符,且赋值结果只能是枚举列表里的枚举常量。
不过由于存在类型转换,有两点说明:
I 隐式类型转换:
由于枚举量都是整数,故可以隐式转为int类型,如 “int n = Sunday;”是没有问题的,但反过来不行,如“week_Days day = 100;”就是错误的,因为“100”不曾存在于枚举列表之内,而枚举创建的变量只能够以同类型的枚举常量来初始化,且默认是枚举列表里的枚举常量。
II 强制类型转换:
可以通过强制类型转换,把不在枚举列表中的常量赋值给枚举创建的变量,如
week_Days day1 = weekday(-1);
week_Days day2 = weekday(100);
C++11的新东西:作用域内枚举
这就好似与在.h文件里使用namespace来限定一样,为了避免重名冲突导致的编译错误或警告,枚举类型可以通过使用class或struct来限定枚举量,进而避免了命名冲突问题。
eg:
enum week_Days { Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
enum weekday { Monday,Tuesday,Wednesday,Thursday,Friday};
enum weekend { Sunday,Saturday};
那么“ int day = Monday”就是不正确的,产生了二义性,因为编译器是无法判断Monday是week_Days类型还是weekday类型,故需要借助 作用域。
修改之:
enum class week_Days { Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
enum class weekday { Monday,Tuesday,Wednesday,Thursday,Friday};
enum class weekend { Sunday,Saturday};
那么就可以轻易区分了——
“ int day = week_Days::Monday”有别于 “ int day = weekday::Monday”
“ int day = week_Days::Sunday”有别于“ int day = weekend::Sunday”。
待更,持续更新中……