第三课
案例:
enum WEEK {MON,TUE,WED,THI,FIR,SAT,SUN};
enum SHAPE {CIRCLE,RECT,LINE,POINT};
1,C语言中的enum
·允许非枚举值赋值给枚举类型,允许其他枚举类型的值赋值给另一个枚举类型;
enum WEEK today=1;//true
today=CIRCLE;//true
·枚举具有外层这作用域,容易造成名字冲突(在不同作用域不会冲突,但是会遵循就近原则,访问不到外层作用域的枚举);
enum OTHER {RECT};//error:"RECT",重定义
int RECT =999;//error:"RECT",重定义
·不同类型的枚举值可以直接比较
if(CIRCLE == MON)
{
printf("666");
}
2,C++中的enum
·只允许赋值枚举值;
enum WEEK today =999l//error:无法从int转化为enum
todat=CIRCLE;//error //无法从enum:SHAPE转化为enum:WEEK
·枚举元素会暴露在外部作用域,不同两个枚举类型,若有相同枚举元素,则会发生冲突;
enum OTHER {RECT};//error RECT重定义
int RECT =999;//error重定义
OTHER::RECT;//true
·不同类型的枚举也可以直接比较
if(CIRCLE==MON)
{
cout<<"999"<<endl;
}
3,C++中的enum class 强枚举类型
enum class WEEK {MON,TUE,WED,THI,FIR,SAT,SUN};
enum class SHAPE {CIRCLE,RECT,LINE,POINT};
·强枚举类型不会将枚举元素暴露在外部作用域,必须通过枚举名去访问;
cout<<SHAPE::RECT<<endl;//输出 1
·不相关的两个枚举类型不能直接比较;
if(SHAPE::CIRCLE==WEEK::MON)//error:类型不同不能直接比较
//可以通过强转解决
if(SHAPE::CIRCLE==(SHAPE)WEEK::MON)//true
4,总结
·C语言枚举类型支持不同类型枚举值之间赋值,以及数字赋值、比较,并且具有外层作用域;
·C++中枚举不允许不同类型的值赋值给枚举类型变量,但仍然支持不同类型比较,具有外层作用域;
·C++强枚举类型不允许不同类型之间赋值、比较,并且不具有外层作用域;