您的位置:首页 > 编程语言 > C语言/C++

有缺陷的枚举类型 和 C++11中的强类型枚举

2015-08-17 17:12 225 查看
首先第一点,我们要弄清一个概念,那就是枚举类型的名字都在其父作用域空间 可见的。举个例子就一目了然了。

enum Type { General, Light, Medium, Heavy };
enum Category{ General, Pistol, MachineGun, Cannon };


由于Category中的General和Type中的General都是全局的名字,因此编译器会报错。

C++11之前的程序员为了解决这个问题,通过namespace来分割全局空间,但是,同理,在新的那个命名空间中,仍然存在着被enum成员污染的问题。

第二点,还有一个长期让程序员不舒服的问题,那就是对于枚举类型,我们通常使用的变量个数都不超过255个,也就是说用一个字节存储就足够了。但是,枚举变量却是按整形来存储的。我们多么希望可以指定存储类型,对于小于255的enum变量,要是可以指定用char来存储就好了。

当然,还有其他一些弊端,就不一一说了。之所以说以上两点,是为了引出今天的主人公——强类型枚举。

声明强类型枚举很简单,只需要在原有的enum后加上关键字class即可。

enum class Type { General, Light, Medium, Heavy };


这样,就声明了一个强类型枚举。强类型枚举有以下几点优势:

强作用域,强类型枚举成员的名称不会被输出到其父作用域空间。
转换限制,强类型枚举成员的值不可以与整型隐式地相互转换。
可以指定底层存储类型,强类型枚举默认的底层类型为int,但也可以显式地指定底层存储类型,具体的做法就是在枚举名称后面加上冒号和类型,该类型可以是除wchar_t之外的任何整形类型。比如 enum class Type : char { General, Light, Medium, Heavy };
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: