一贯的风格,为什么c++ 11为什么要引入强枚举类型,主要是为了解决什么问题?
在此之前我们来看看平时我们的枚举用法:
enum是我们编译器内置的类型.
首先枚举类型是不安全的,为什么不安全?
//体重
namespace T {
enum Type {
normal,medium,height
};
}
//商品价格
enum price{
height = 1 ,normal = 0
};
void isHeight(T::Type t) {
if(t == height){
cout << "your weight is height" << endl;
}
else
{
cout << "youre weight is not height" << endl;
}
}
我们原本是需要判断体重是否偏高? 测试时,我们是如此输入的.
int main(int argc, const char * argv[]) {
isHeight(T::Type::medium);
return 0;
}
输出结果如下 :
consle:
your weight is height。
我们明明输入的体重是medium,是比较正常的体重,但是判断出了高体重。
这是因为编译器在做枚举数值类型比较的时候,会被隐式的转化为int数据类型,然后再进行int数据类型进行比较.
这是一种非常不安全的比较,一般来说,编译器会进行提示,但是不会报错.
为了解决上面的问题,我们引入了强类型的枚举类型,可以帮助我们在编译截断进行类型的检测,帮助我们更好的提升我们程序的健壮性.
下面我们看看我们升级后的写法:
强类型枚举的定义:
enum class Type {normal,medium,height};
在enum后面加上class关键字,就是声明为强类型枚举类型.
在转化为强枚举类型后有下面的几个好处:
1.强枚举类型的作用域不用输出到父作用域.
怎么理解?看我们的代码:
namespace T {
enum class Type {
normal,medium,height
};
enum Type2 {
normal,medium,height
};
}
在使用的时候我们可以使用:
T::normal,T::Type2::normal这样的写法.
T::normal大家自己亲自去测试,居然是合法的。
WTF???
第一种写法:T::normald编译可以通过,那是因为枚举类型可以把自己的作用域扩张到父作用域.
但是如果使用了强枚举类型,那么作用域就会被锁定在强枚举的类型范围内,不会输出到父作用域,更加严谨.
2.在进行类型比较的时候,强枚举类型不会进行隐式的转换,编译器会进行类型的检测.
如果是强类型枚举类型,编译期间就不会通过,程序更加健壮了。
啊,玩意说了,C++ 11的强枚举类型,还有一个扩展的属性,就是可以指定元素的基本数据类型:
默认我们的enum type {…} 默认都是int类型的,在C++ 11中我们也可以指定为char类型.
机器型号:mac os 64位操作系统
enum class C :: char { C1,C2};
sizeof(C::C1) ; //输出1
enum class L:: unsigned long {L1,L2};
sizeof(L::L1) ;//输出8