[c++11]enum¶
c++
枚举(enum
)类型是由一组自定义标识符(custom identifiers
,也称为枚举器enumerator
)定义的类型。枚举类型定义的对象可以赋值为任一个自定义标识符。
从c++11
开始,还可以使用枚举类型定义类,以及自定义枚举数据类型
枚举类型语法¶
定义枚举类型¶
enum type_name {
value1,
value2,
value3,
.
.
} object_names;
type_name object_name = valuen;
-
使用关键字
enum
定义枚举类型,输入类型名type_name
和自定义标识符value1/value2/value3/...
,就完成了枚举类型的定义 -
可以直接输入
object_names
进行对象实例化,也可以用类型名来定义新的枚举对象 -
枚举对象可以赋值为任一个自定义标识符
示例一¶
定义颜色枚举colors_t
enum colors_t {black, blue, green, cyan, red, purple, yellow, white};
创建枚举对象mycolor
,赋值为其中一个自定义标识符,并进行测试
colors_t colors = green;
if (colors == green) {
cout << "green" << endl;
}
输出结果:
green
枚举与整数的关系¶
使用枚举声明的枚举类型的值可以隐式转换为整数类型,反之亦然。默认自定义标识符集的第一个值转换成整数0
,第二个转换成1
,以此类推
也可以为枚举类型中的任何标识符指定特定的整数值。如果后面的标识符本身没有给出它自己的整数值,那么它会自动假定为前一个标识符表示的整数值加一
每个枚举对象的内存大小等同于整数值的大小:sizeof(int)=4
示例二¶
对于颜色枚举colors_t
而言,枚举值green
表示整数值2
colors_t colors = green;
if (colors == 2) {
cout << "green" << endl;
}
结果
green
新建枚举类型months_t
,第一个枚举值赋值为整数1
,那么整数2
表示的是第二个枚举值
enum months_t {
january = 1, february, march, april,
may, june, july, august,
september, october, november, december
} y2k;
int main() {
months_t months = (months_t) 2;
if (months == february) {
cout << "february" << endl;
}
return 0;
}
结果
february
比较枚举对象的大小和整数值的内存大小
cout << sizeof(months) << endl;
cout << sizeof(march) << endl;
cout << sizeof(2) << endl;
结果
4
4
4
枚举类语法¶
参考: Enumerated types with enum class
从c++11
开始,可以定义枚举类
也可以定义枚举结构体:enum struct
定义枚举类类型¶
enum class type_name {
value1,
value2,
value3,
.
.
} object_names;
type_name object_name = type_name::valuen;
-
使用关键字
enum class
定义枚举类,输入枚举类名type_name
,枚举类值value1/value2/value3/...
-
以直接输入
object_names
进行对象实例化,也可以用类型名来定义新的枚举类对象
使用枚举类型定义类(即枚举类),里面的枚举值不能够隐式转换为int
类型,能够保证类型安全;同时枚举器名称必须由枚举类型名称限定,有利于程序健壮性。
示例三¶
enum class colors_t {
black, blue, green, cyan, red, purple, yellow, white
};
int main() {
colors_t colors = colors_t::green;
if (colors == (colors_t) 3) {
cout << "green" << endl;
}
cout << sizeof(colors) << endl;
cout << sizeof(colors_t) << endl;
cout << sizeof(colors_t::green) << endl;
return 0;
}
结果:
4
4
4
由测试结果可知,虽然其内存大小仍旧等同于整数,但枚举值无法转换为整数值
自定义数据类型¶
从c++11
开始,用枚举声明的枚举类型对其基础类型也有更多的控制;它可以是任何整型数据类型,比如char/short/unsigned int/int
等等。指定数据类型可以有效减少占用内存
enum type_name : int_type {
value1,
value2,
value3,
.
.
} object_names;
enum class type_name : int_type {
value1,
value2,
value3,
.
.
} object_names;
在枚举类名后加上指定整数类型即可
测试四¶
enum class colors_t : char {
black, blue, green, cyan, red, purple, yellow, white
};
cout << sizeof(colors) << endl;
cout << sizeof(colors_t) << endl;
cout << sizeof(colors_t::green) << endl;
结果
1
1
1
空枚举¶
如果枚举没有枚举器,则默认为0
enum byte_t : unsigned char {
};
int main() {
byte_t byte;
cout << byte << endl;
cout << sizeof(byte) << endl;
return 0;
}
结果
0
1