《Effective Modern C++》学习笔记之条款十:优先选用限定作用域的枚举类型,而非不限作用域的枚举类型

首先通过两行代码了解,什么是限定作用域的枚举类型,什么是不限作用域的枚举类型。

enum Color{black,white,red};      //不限作用域的枚举类型 

enum class Color{black,white,red}; //限定作用域的枚举类型,多了一个class关键字

优先使用限定作用域的枚举类型的原因有三个:

1、降低名字空间污染。防止枚举值名称与变量名冲突。

//不限作用域的枚举类型 
enum Color{black,white,red};    
auto white = false;          //变量white与枚举值white名称冲突 


//限定作用域的枚举类型
enum class Color{black,white,red};
auto white = false;        //不冲突

2、枚举量是更强类型的,禁止其向其他类型的隐式转换,除非使用static_cast关键字强制类型转换。

//不限作用域的枚举类型 
enum Color{black,white,red}; 
Color c = 1;          //可以与整型直接隐式转换


//限定作用域的枚举类型
enum class Color{black,white,red};
Color c = 1;          //编译报错,不能直接转换,需要借助static_cast关键字

3、可以直接进行前置声明

enum Color;      //不知道底层实现,编译报错,不能进行前置声明

enum class Color; //底层实现默认为int,可以进行前置声明

关于不限作用域的枚举类型不能前置声明的原因,这里简单介绍一下:为了能够表达出不限作用域的枚举类型区间,编译器通常会为枚举类型选用足够表示其区间的类型作为其底层实现,例如,如果枚举值是1~10,那使用short就可以完成,但是这时候又向其中新加了一个值0xFFFFFFFF,那编译器不得不改用long来表示,注意,此时所有使用该枚举值的地方将都会重新编译,所以由于无法知道不限作用域的枚举类型的底层实现,所以也就无法为其分配空间,也就无法前置声明。而限定作用域的枚举类型可以前置声明的原因是,其默认的使用int作为其底层实现。

如果我们在声明时候指定其底层实现,则不限作用域的枚举类型也可以前置声明,例如:

enum Color:long;       //指定了底层类型,可以前置声明

enum class Color:int;//同理,限定作用域的枚举类型也可以指定底层类型

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值