有缺陷的枚举类型 和 C++11中的强类型枚举
2015-08-17 17:12
225 查看
首先第一点,我们要弄清一个概念,那就是枚举类型的名字都在其父作用域空间 可见的。举个例子就一目了然了。
由于Category中的General和Type中的General都是全局的名字,因此编译器会报错。
C++11之前的程序员为了解决这个问题,通过namespace来分割全局空间,但是,同理,在新的那个命名空间中,仍然存在着被enum成员污染的问题。
第二点,还有一个长期让程序员不舒服的问题,那就是对于枚举类型,我们通常使用的变量个数都不超过255个,也就是说用一个字节存储就足够了。但是,枚举变量却是按整形来存储的。我们多么希望可以指定存储类型,对于小于255的enum变量,要是可以指定用char来存储就好了。
当然,还有其他一些弊端,就不一一说了。之所以说以上两点,是为了引出今天的主人公——强类型枚举。
声明强类型枚举很简单,只需要在原有的enum后加上关键字class即可。
这样,就声明了一个强类型枚举。强类型枚举有以下几点优势:
强作用域,强类型枚举成员的名称不会被输出到其父作用域空间。
转换限制,强类型枚举成员的值不可以与整型隐式地相互转换。
可以指定底层存储类型,强类型枚举默认的底层类型为int,但也可以显式地指定底层存储类型,具体的做法就是在枚举名称后面加上冒号和类型,该类型可以是除wchar_t之外的任何整形类型。比如 enum class Type : char { General, Light, Medium, Heavy };
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++虚函数表
- C++中的指针
- C++ map的基本操作和使用
- 使用C语言来解决循环队列问题的方法
- 北邮考研复试C语言上机题目精选
- c++builder 多线程
- 02第一个C语言程序
- C++面试问题
- iOS每日一记---------------------之C语言的一些重点难点
- 详解C语言中的char数据类型及其与int类型的转换
- OC学习笔记之C中的运算符
- C语言结构体排序方法
- C语言得到当前系统时间
- c语言笔记
- 黑马程序员-----c语言基础与重点第一篇——C知识基础
- static关键字的用法(C++)
- 01C语言的概述
- C++基本数据类型
- JAVA Socket编程和C++ Socket编程有什么不同
- [LeetCode] Sort List