C++11中的强类型枚举
admin
2024-05-20 21:13:11

C++11中的强类型枚举

1.C/C++98中的枚举的缺陷

枚举在C语言中是狠古老的类型,它分为匿名枚举和具名枚举,
如果是匿名枚举,那么它的用法只有一种:

//方法一:
enum {Male,Female};//方法二:
#define Male 0
#define Female 1//方法三:
static const int Male=0;
static const int Female=1;

如上三种方法实现的效果是差不多的,不过采用宏方法会引起一些不必要的纠纷。方法一和方法三在实现效果上几乎完全一致,方法一和方法三等价替换。

对于具名枚举来说,一般用法就是声明一个变量是枚举类型的,然后该变量只能由枚举成员初始化和赋值

enum Gender{Male,Female};
Gender a=Male;
a=Female;
a=1;//错误

C/C++98中的枚举的缺陷主要是三个:

  1. 对全局名称空间的污染
  2. 枚举成员(或变量)可以隐式转化为整型
  3. 枚举成员(或变量)的底层类型,即整型由编译器决定

在C++11中,我们引入了名称空间的概念,我们同样希望枚举成员能够采用名字::成员的方式进行访问,而不是直接将大量的枚举成员暴露在当前名称空间中。
此外.我们更希望枚举类型独立于整型,或者说,至少它不应该自动转化为整型,例如下面这样。

    enum Gender{Male,Female};Gender a=Male;int b=a;int c=Female;

我们看最后一个缺陷,即枚举成员(或变量)的底层类型一般是整型,但是不同的编译器的设定不同,有可能一些是有符号整型,而另一种就是无符号整型。

enum Gender{Male=-1000,Female=9999};//这段代码可能在某些编译器中报错

2.强类型枚举的使用

强类型枚举(strong-typed enum)或者称之为枚举类,主要是针对上述三个缺陷进行了修补。

#include
using namespace std;
enum class Type {General,Light,Medium,Heavy};
enum struct Category{General=1,Pistol,MachineGun,Cannon};int main()
{Type t=Type::Light;t=General;//编译错误if(t==Category::General)//编译错误cout<<"A"< Type::General)//编译通过cout<<"B"<0)//编译错误cout<<"C"<::value<::value<

我们总结出

  1. 强类型枚举中的成员,只能采用名字::成员的方式进行访问
  2. 强类型枚举类型的变量,只能和同是强类型枚举的值进行比较
  3. 强类型枚举中的class关键词,可以用struct进行等价替换
#include
using namespace std;
enum class C: char{C1=1,C2=2};
enum class D: unsigned int {D1=1,D2=2,Dbig=0xfffffff0u};
int main()
{cout<

而且我们在声明强类型枚举的同时,可以显式定义它的底层类型,enum class C: char,为了通用性,C++11也对C风格枚举进行了这个优化,即允许C风格枚举规定底层类型.

实际上,强类型枚举也存在匿名类型,不过如果它是匿名的,你就无法访问它的枚举成员了,不过你可以使用decltype来找到名称,不过也是多此一举的,所以匿名强类型枚举没啥用。

相关内容

热门资讯

奥地利小镇邂逅农民思想家多伊布... 旅游奥地利期间,每天与同行的徐静波教授晨起一同散步,有时沿着多瑙河,有时在维也纳的森林间,但给我印象...
读懂济南|从“一阵风”到“长红... 齐鲁晚报·齐鲁壹点 王贝艺大明湖畔的狂欢还未收尾,五龙潭的泼水狂欢又已开场;广智里的咖啡香还没散尽,...
黄河壶口瀑布水量大增 形成壮美...   9月9日,受降雨天气影响,位于晋陕峡谷的黄河壶口瀑布水量大增,主副瀑布连成一片,形成壮美瀑布群景...
“请3休13”点燃中秋国庆国内... 财联社9月10日讯(记者 胡皓琼)中秋前一日火车票开售,中秋国庆国内游预订提速。财联社记者从OTA平...
微言|游客暴增却带不来利润?“... 中秋、国庆假期将至,很多地方将迎来旅游旺季。然而,一些地方旅游人次创新高,民宿经营者却普遍反映利润摊...