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

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来找到名称,不过也是多此一举的,所以匿名强类型枚举没啥用。

相关内容

热门资讯

什么是感情? 什么是感情?对于感情而言,就是,当你面对两个人的时候:一个是你不爱的人,但是他有雄厚的经济基础,可以...
《机器之血》这部剧还是很不错的... 《机器之血》这部剧还是很不错的,其中几位主演的演技如何?演员演技表情很不错都挺到位的演技很好,剧情也...
清凉游、非遗赛事……多彩假日解... 央视网消息:天气炎热,很多人选择戏水消解暑意。为了满足游客需求,黑龙江省集贤县将冬季玩雪胜地改造成森...
安全教育的意义是什么? 安全教育的意义是什么?安全教育能够适应复杂的社会治安形势,提高人们的安全意识,从根本上控制和预防安全...
第一次去张家界五日游攻略,张家... 第一天:初探天门奇观 清晨从长沙乘坐高铁抵达张家界西站,一出站就被四周环绕的群山震撼。我提前联系了当...
重庆荔枝打卡地图来了!可去这些... 2025重庆荔枝打卡地图 重庆市气象服务中心供图 在重庆也能享受边摘边吃荔枝的快乐?近日,重庆市气象...
天涯海角石头的来历 天涯海角石头的来历
手机被偷,第一件事情应该干什么... 手机被偷,第一件事情应该干什么?首先打开电脑并登陆手机的账户,对手机实行定位,之后远程打开挂失模式,...
餐厅服务员,遇到退菜该怎么办? 餐厅服务员,遇到退菜该怎么办?餐厅服务员碰到客人退菜,首先要问清楚退菜的原因,自己能解释清楚就自行处...
刘家成委员称,影视剧选角不能唯... 刘家成委员称,影视剧选角不能唯流量论,你觉得演技重要还是流量重要?其实我们都知道很多时候有一些明星是...
作文灰太狼回乡记童话故事 作文灰太狼回乡记童话故事这是我本人原创,而且是第一次创作童话,想必有不妥之处,请君参考! ...
前世今生布莱恩魏斯孩子适合看吗 前世今生布莱恩魏斯孩子适合看吗适合。《前世今生》是2008年由江苏人民出版社出版的图书,讲述一个27...
假期读完这六本书我突然不浮躁了 假期读完这六本书我突然不浮躁了读完这6本书我突然不浮躁了!《就这样读懂心理学》作者:璞玉英华科普小分...
手机内存卡哪里买 手机内存卡哪里买一般,手机店都有。新蛋网或京东网,4G的TF卡只卖几十元,有正品保障.并且有发票,比...
求好听的古代嫔妃封号 求好听的古代嫔妃封号虞、笙、晟、萌、艾、魅、珂、晗墨 湘 茗 曦 璃 萧 懿 娴
古筝考级 有用吗? 古筝考级 有用吗?有用的,如果你的级别到8级以上,考大学在同龄人面前,录取的几率就大一些
爱无悔中罗仁杰什么时候见到高明... 爱无悔中罗仁杰什么时候见到高明月你好,很高兴帮助你为你解答问题,疑问祝你生活愉快,幸福: 你确定了是...
和尚敲钟三更起什么意思 和尚敲钟三更起什么意思佛教的早课一般在凌晨2.3点钟起来,念经,念佛。。。。。。。。。。。。和尚敲钟...
单腿鹅的故事说明了什么道理 单腿鹅的故事说明了什么道理告诉我们的道理是嫉妒这个东西,害处十分大。我们一定要从小克服它,过好自己的...
人如其名是什么意思? 人如其名是什么意思?“人如其名”是一句谚语,意为一个人的名字与他的个性、性格和特点相对应。人们普遍认...