除了#define,有三种在类内声明常量的方式:
- const声明常量;
- 类内声明一个枚举;
- 指定底层实现(可以用short之类实现枚举);
const声明常量
const声明的常量在每个对象中都会存放一个备份(这是其缺陷);
c++11之前,const声明常量时不能初始化,因为类只是描述对象的形式,没有创建对象;此时给出初始化的值,将无法存放。所以需要用初始化列表进行初始化。
c++11之后,没这个限制了。
enum枚举常量
在类内声明一个枚举类型,枚举常量的作用域将是整个类,且枚举类型存放于常量区,不占用对象的内存!!!
可以声明一个没有枚举名的枚举类型;
域内枚举
域内枚举两个特性:
- 消除同名冲突;
- 禁止隐式转换成整型;
消除冲突:
常规情况下,如果声明了下面两个枚举,将会出现冲突(常量名冲突)
enum size_egg {S, M, L, J};
enum size_Tshirt {S, M, L, XL};
现在可以声明域内枚举,消除这种冲突(使用 class / struct 关键字)
enum class size_egg {S, M, L, J};
enum class size_Tshirt {S, M, L, XL};
禁止隐式转换成整型:
可以显式的用类型转换(int)转换成整型;
改变枚举底层实现:
(这个功能在树上看到的,但是我实际没测试成果,不知道为什么)
class:short
enum class : short size_egg {S, M, L, J};