enumclass⽤法
enum的主要缺点
1、类型不明确
⾸先,⽆法指定数据类型,导致我们⽆法明确枚举类型所占的内存⼤⼩。这种⿇烦在结构体当中尤为突出,特别是当我们需要内存对齐和填充处理的时候。
#include <iostream>
enum Version { Ver1 = 1, Ver2, Ver3 };
struct MyStruct {
MyStruct(Version ver) { this->Ver = ver; }
Version Ver;
//
};
int main() {
MyStruct m(Version::Ver1);
std::();
return 0;
}
此时我们的解决办法还是:不使⽤enum
#include <iostream>
enum Version { Ver1 = 1, Ver2, Ver3 };
struct MyStruct {
MyStruct(Version ver) { this->Ver = ver; }
unsigned char Ver;//将enum Version转为unsigned char类型
/
/
};
int main() {
MyStruct m(Version::Ver1);
std::();
return 0;
}
其次,当我们使⽤enum时,我们⽆法决定编译器底层是如何对待enum的(⽐如:signed和unsigned)。
#include <iostream>
enum MyEnum { num1 = 1, num2 = 2, numn = 0xFFFFFF00U };
int main() {
std::cout << num1 << std::endl;
std::cout << num2 << std::endl;
std::cout << numn << std::endl;
std::();
return 0;
}
VS2015运⾏结果:
1
2
-256
CodeBlocks运⾏结果:
1
2
4294967040
在 numn=0xFFFFFF00U;中,我们希望0xFFFFFF00表现为unsigned。但是不同的编译器其标准也不同。这就给我们的程序带来了许多的不确定性。
2、enum的作⽤域
例如:
#include <iostream>
enum color{red,blue};//定义拥有两个成员的enum,red和blue在enum的⼤括号外部可以直接访问,⽽不需要使⽤域运算符。
int main() {
std::cout << blue << std::endl;
std::();
return 0;
}
// 结果为1
就如上⾯的代码,我们可以在blue的⼤括号之外访问它,color的成员被泄露到了该⽂件的全局作⽤域中(虽然它尚不具备外部链接性)。可以直接访问,⽽不需要域运算符的帮助。但是这不是关键,有时我们反⽽觉得⾮常⽅便。下⾯才是问题所在:
问题:⽆法定义同名的枚举成员
enum color { red, blue };
//enum MyEnum { red, yellow }; ERROR, 重定义;以前的定义是“枚举数”
解决:可以使⽤命名空间,但形式上略显⿇烦。
enum class 和enum struct
1、声明:
enum class Name : TypeName {name1, };
2、类型转换保护
enum c++与整形之间不会发⽣隐式类型转换,但可以强制转换
#include <iostream>
enum class color { red, green, yellow};
int main() {
//int res(color::red); //ERROR , “初始化”: ⽆法从“color”转换为“int”
//color col(2);//ERROR , “初始化”: ⽆法从“int”转换为“color”
//强转
int res(static_cast<int>(color::red));//OK
color col(static_cast<color>(1));//OK
std::();
return 0;
}
3、指定底层数据类型
enum class color:unsigned char{red,blue};
enum calss colorb:long long{yellow,black};
4、作⽤域
#include <iostream>
enum class color { red, green, yellow};
enum class colorX { red, green, yellow };
int main() {
//使⽤域运算符访问枚举体成员,强转后打印
std::cout << static_cast<int>(color::red) << std::endl;
std::cout << static_cast<int>(colorX::red) << std::endl;
std::();
return 0;
}
参考: