首页 > 代码库 > C++11:强类型枚举(enum)

C++11:强类型枚举(enum)

// C++11之前的enum类型是继承C的,不温不火;
// C++11对enum动刀了,加强了类型检查,推出强类型enum类型,眼前一亮
// 使用过QT 的都知道,早就应该这么做了,用的很爽!!

// 一、C中enum类型的局限
// 1、非强类型作用域

enum type1{a, b, c};
enum type2{a, d, e};

//问题来了,两种枚举类型都有a枚举常量,而且作用域相同,发生了冲突

//2、允许隐式类型转换

if(type1::a == type2::d){;}

//两种不同enum常量比较没有实际意义,但是编译器是先将enum常量转换为int类型后,再比较的,不会报错

// 3、占用存储空间极其符号不确定

enum type3{a=1, b=0xFFFFFFFFFLL};
cout<<sizeof(type3::a)<<endl;//可能为8,视编译器而定,由其对齐字长决定的
cout<<type3::b<<endl;//输出大小不定,可能为0

//问题来了,存储大小和符号都有未定的因素

// 二、C++11强类型enum类型

//语法:

enum class type4:type{a, b, c};//加class,具名,指定底层类型type
enum class type5{a, b, c};//不指定底层类型

//特点及用法:
// 1、强作用域

type4 t = type4::a; //必须指定强类型名称
type4 p = a;        //错误

//2、不可隐式转换

if(t<type4::b);                   //同一个enum类型比较,可以
if(t>type5::b);                   //非同一个enum类型,不能隐式转换为int等值,不嗯呢该比较
if((int)t > (int)type5::b)        //强制类型转换,可以通过

//3、可以指定底层类型

enum class type6:char{a=1, b=2};
enum class type7:unsigned int{a=0xFFFFFFFF};

//既可以节省空间,又可以指定符号

//三、C++11是兼容并拓展了C enum类型的

enum type8:char{a=1, b=2};
type8 t =a;

//拓展并兼容C enum类型

C++11:强类型枚举(enum)