1.定义:一种新类型且属于字面值常量类型:将一组 整形常量 组织在一起。
2.限定作用域枚举类型定义:enum class(struct) classname
enum class open_modes{inptu,output,append};
3.不限定作用域枚举类型定义:enum class(struct) 或enum
enum color{red,yello,gree}; //不限定作用域
enum {floatP,doubleP} typeP,typeP2; //未命名的不限制作用域,只能在定义enum时定义它的对象,以逗号分隔的声明列表,这里是typeP,typeP2。
4.限定作用域枚举成员的作用域规则:遵循常规作用域规则,并且在枚举类型的作用域外是不可访问的。与之相反,不限定作用域的枚举成员的作用域与枚举本身的作用域相同。
enum color{red,yellow,green}; //不限定作用域枚举类型
enum stoplight{red,yellow,green}; //错误,重复定义枚举成员
enum class peppers{red,yellow,green};//正确,限定作用域的成员隐藏了不限定作用域的枚举成员
color eyes=green; //能正确访问
peppers p=green; //所在作用域没有green
peppers::red; //用 :: 访问枚举成员
5.枚举成员值:默认情况从0开始,一次加1,也可以为一个或几个枚举成员指定专门的值
enum class intType{charType=,intType=};
//枚举值不一定唯一,如果没有显示提供初始值,则当前枚举成员的值等于之前枚举成员的值加1
6.枚举用途:枚举成员是const的,因此初始化枚举成员的初始值必须是常量表达式,所以枚举成员本身也是一条常量表达式。
constexpr intType charbits=intType::charType;
//enum可以作为switch语句的表达式,枚举值可以用在case的标签。
//可以将枚举类型作为一个非类型模板参数形参使用
//在类的定义中初始化枚举类型的静态成员
7.枚举类型对象的初始和赋值:必须用该类型的枚举成员或者改类型的另一个对象。
enum color{red,yellow};
color eyes=color::red;
color nodes=eyes;
8.枚举大小:
①:一个不限定作用域的枚举类型对象或枚举成员自动转化成整形
②默认情况下:限定作用域的枚举成员是int。对于不限定作用域的枚举成员不存在默认类型,但肯定能容纳最大枚举成员值。
③指定枚举大小:
enum intValues:unsigned long long{charType=,intType=};
//每个成员的类型都是unsigned long long 类型
9.枚举类型的前置声明:必须指定其成员的大小,并且enum的声明和定义必须匹配
enum intValue:unsigned long long; //不限定的必须指定成员类型
enum class open_modes; //限定的默认是int
10.形参匹配和枚举类型:只要记住:枚举类型对象的初始化或赋值规则就行了。但是可以将一个不限定作用域的枚举类型对象或枚举成员传给整形形参(因为是初始化整形而不是枚举类型)