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

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

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 };

你可能感兴趣的:(C++学习笔记)