C++11学习(4)——枚举类

在现有的C++中有枚举类型,关键字为enum,然则它会存在三个问题:

1. 在那些不需要枚举类型表现为int类型时,它却默认表现为int类型,这会导致错误发生。

2. 可转换的枚举会使得他的枚举值在其周围的代码范围内都是可见的,这可能会导致名字冲突。

3. 不可以指定枚举底层数据类型(只能是int型),这可能导致代码代码不容易被理解和兼容性问题,而且不可以进行前向声明。


针对这些隐患,c++11提供了新的新的枚举——枚举类,也叫“强类型枚举”,是强类型的,带有类域,与之前的枚举类型对比如下:

	enum Alter{green,yellow,election,red};	//传统的枚举
	enumclass Color{red,blue};	//新的枚举类,具有类域,强类型的
	enumclass TrafficLight{red, yellow,green};
	
	Alter a = 7;	//错误,传统枚举不是强类型,a没有数据类型
	Color c = 7; 	//错误,没有默认的int到Color
	int a2 = red;	//正确,只有Alter的枚举值没有类域,这里的red肯定是Alter的,Alter枚举自动转换成int
	int a3 = Alter::red;	//c++11正确,指定了类域,c++98不正确
	int a4 = blue; //错误,blue没有指定类域
	int a5 = Color::blue;	//错误,没有Color到int的转换
	Color a6 = Color::blue;	//正确
新的枚举类,有着原本枚举的功能,又具备了类的特点,比如类域成员不能进行隐式类型转换,如c和 a5。另外,枚举类能够指定枚举底层的数据类型,从而对枚举值的内存进行直观控制。实现如:

<span style="white-space:pre">	</span>enumclass Color : char{red, blue};

默认情况下,枚举值的类型是int型:

<span style="white-space:pre">	</span>enumclass TrafficLight{red, green,yellow};


同样的,枚举类指定了底层数据类型从而就能够前向声明,在定义一个枚举类型之前就使用这个枚举类,只要有个预先声明即可。例如:

<span style="white-space:pre">	</span>enumclass Color_code:char;	//前向声明
<span style="white-space:pre">	</span>void foobar(Color_code *p);	//声明的使用
<span style="white-space:pre">	</span>//...
<span style="white-space:pre">	</span>enumclass Color_code:char{red, yellow, blue, green};	//定义




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值