C++11标准以前的枚举类型有如下缺点:
1. 非强类型,即在枚举中定义的成员会自动输出到父作用域,在枚举的父空间作用域中我们可以直接访问枚举中的某个成员而不需使用域限制符。
2.可隐式转换为int类型。
3. 占用存储空间,编译器会根据数据类型的不同对枚举类型分配不同的长度,例如在g++中,普通的枚举占用了4个字节,但如果数据长度大于四个字节,g++会将枚举类型扩展为8字节。例如下面的代码,Dbig的长度超过了四字节,编译器会将枚举类型扩展为8字节。
int main()
{
enum D{D1=1,D2=2,Dbig=0xfffffffffLL};
cout<<sizeof(D1)<<endl ; //8 byte
return 0;
}
4.符号性不确定,在vc++中会以无符号整形作为枚举的底层实现,而在g++中,会根据枚举的类型进行变动。
C++11标准中引入了一种新的枚举类型,称为强类型枚举,声明方式如下:
enum class myEnum{m1=1,m2=2};
只要在enum关键字后加上class关键字即可。
强类型枚举还允许我们指定枚举数据的底层数据类型,只要在枚举名称后加上:type就行,使用方式如下
enum class myEnum: char{m1=1,m2=2};
强类型枚举有如下特点:
1. 强作用域,枚举成员的名称不会被输出到其父作用域空间
2. 转换限制,枚举成员的值不可以被隐式地转换为整形
3. 可以指定底层类型。默认底层类型式int。
C++11对现有枚举类型进行了扩展:
1. 可以显示地指定底层类型,方法式在枚举名称后面加上 :type,如下所示:
enum myEnum: char {m1,m2,m3};
2. 枚举成员的名字除了可以自动输出到父作用域空间,也可以在枚举类型定义的作用域内有效。比如下面两种写法都是合法的:
enum myEnum{m1,m2};
myEnum e1 = m1;
myEnum e2 = myEnum::m1;