弱类型枚举(weakly typed enum)
一开始,由于C++的枚举类型来源于C,所以出于设计简单的目的,枚举类型只用来表示整型常量的一些名字。
语法:
enum Gender {
MALE,
FEMALE
};
这里MALE和FEMALE就是枚举值,由于枚举默认从0开始,并且后一位枚举值自动增加1,所以数值上就分别表示0和1。
但是弱类型枚举有几个缺点,一是枚举值没有限定作用域(unscoped),就是说同一作用域下两种枚举类型的同名枚举值会产生冲突:
enum Cup {
SMALL
};
//重复定义SMALL,编译出错
enum Size {
SMALL
};
//本来显示指明Cup::SMALL或者Size::SMALL是没有歧义的,但谁让最初设定可以不带类型使用枚举值,所以还没编译到这句,定义冲突就直接over了
Cup cup = SMALL;
二是枚举值可以隐式转换为整型变量,当然这一设定也是不好的:
enum Number {
ZERO
};
//正常编译
int n = ZERO;
强类型枚举(strongly typed enum)
为了修复以上缺陷,C++11引入了新的强类型枚举,只需要在枚举类型名前面加上class关键字即可,和弱类型枚举类型语法不冲突:
enum class Gender {
MALE,
FEMALE
};
//强类型枚举使用时必须指定属于哪一种枚举类型
Gender gender = Gender::MALE;
//转换为整型变量,必须使用显示转换
int n = static_cast<int>(Gender::MALE);
除此之外,强类型枚举还可以指定底层整型类型(若没有指定则默认为int,而弱类型枚举没有默认类型):
enum class Gender : long {
MALE,
FEMALE
};
所以以后写代码还是尽量用新的强类型枚举吧。
网友评论