[toc]枚举Enum
0x1
0x11传统类型枚举
在传统 C++ 中,枚举类型并非类型安全,枚举类型会被视作整数,
则会让两种完全不同的枚举类型可以进行直接的比较(虽然编译器给出了检查,但并非所有),
甚至枚举类型的枚举值名字不能相同,这不是我们希望看到的结果。
0x12 强制类型枚举
强制类型枚举(Strongly-type enums),是C++ 11新特性
用来解决传统C/C++枚举类型的缺陷包括
非强制类型作用域、
允许隐式转换成整型、
占用存储空间及符号的不确定性
它是一种新的枚举类型,即“枚举类”。
0x2 对比(解决问题)
枚举类型的枚举值名字不能相同
传统类型枚举 允许隐式转换成整型
枚举常量占用存储空间以及符号性不确定
0x21 枚举类型的枚举值名字不能相同
// 枚举类型的枚举值名字不能相同
// error: 'green' conflicts with a previous declaration
enum CoatColorEnum { blue, green, yellow };
enum PantsColorEnum { red, green, white };
// 使用强类型枚举
enum class CoatColorEnum { blue, green, yellow };
enum class PantsColorEnum { red, green, white };
0x22 传统类型枚举 允许隐式转换成整型
在传统类型枚举中,枚举类型会被视作整数
在强类型枚举中,不允许隐式转换成整型,只能显示转换
enum class CoatColorEnum { value1, value2, value3 };
enum class PantsColorEnum { value4, value5, value6 };
#if 0
// 传统类型枚举用法
cout << CoatColorEnum::value1 << "\t"
<< CoatColorEnum::value2 << "\t"
<< CoatColorEnum::value3 << endl;
cout << PantsColorEnum::value4 << "\t"
<< PantsColorEnum::value5 << "\t"
<< PantsColorEnum::value6 << endl;
#endif
// 强类型枚举用法
cout << static_cast<int>(CoatColorEnum::value1) << "\t"
<< static_cast<int>(CoatColorEnum::value2) << "\t"
<< static_cast<int>(CoatColorEnum::value3) << endl;
cout << static_cast<int>(PantsColorEnum::value4) << "\t"
<< static_cast<int>(PantsColorEnum::value5) << "\t"
<< static_cast<int>(PantsColorEnum::value6) << endl;
#if 0
// 传统类型枚举用法
if (PantsColorEnum::value5 > CoatColorEnum::value1) {
cout << "value5 > value1" << endl;
} else {
cout << "value5 < value1" << endl;
}
#endif
// 强类型枚举用法
if (static_cast<int>(PantsColorEnum::value5) > static_cast<int>(CoatColorEnum::value1)) {
cout << "value5 > value1" << endl;
} else {
cout << "value5 < value1" << endl;
}
0x23 枚举常量占用存储空间以及符号性不确定
枚举常量占用存储空间以及符号性不确定。
C++标准规定C++枚举所基于的“基础类型”是由编译器来具体实现
在强类型枚举中,可以指定数据类型
enum A { A1 = 1, A2 = 2, ABig = 0xFFFFFFFFU };
enum B { B1 = 1, B2 = 2, BBig = 0xFFFFFFFFFUL };
cout << sizeof(A1) << endl; // 4 [差异点]
cout << ABig << endl; // 4294967295
cout << sizeof(B1) << endl; // 8
cout << BBig << endl; // 68719476735
enum class newA:long { A1 = 1, A2 = 2, ABig = 0xFFFFFFFFU };
enum class newB:long { B1 = 1, B2 = 2, BBig = 0xFFFFFFFFFUL };
cout << sizeof(newA::A1) << endl; // 8 [差异点]
cout << static_cast<long>(newA::ABig) << endl; // 4294967295
cout << sizeof(newB::B1) << endl; // 8
cout << static_cast<long>(newB::BBig) << endl; // 68719476735