第三课

案例:
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++强枚举类型不允许不同类型之间赋值、比较,并且不具有外层作用域;