17. 枚举类型与共用体
17.1. 枚举类型
枚举类型(enumeration)使我们可以将一组 整型常量 组织在一起。格式
enum <类型名> {<枚举成员>};
枚举成员不能是数值,即不能是类似于{1,2,3}。可以定义 无类型名 的枚举类型。
初始化
默认情况下,每个枚举变量的值就是其序号,从0开始,依次加1。
enum Week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
//Sun=0, Mon=1, Tue=2, Wed=3, Thu=4, Fri=5, Sat=6
显式提供初始值。
enum Week {Sun=1, Mon, Tue, Wed, Thu, Fri=100, Sat};
//Sun=1, Mon=2, Tue=3, Wed=4, Thu=5, Fri=100, Sat=101
枚举变量
定义枚举类型之后,就可以定义该枚举类型的变量,或者与枚举类型同时定义。枚举变量的值只能取枚举常量表中所列的值。
1enum Week {Sun=1, Mon, Tue, Wed, Thu, Fri=100, Sat} day_1;
2// 全局变量 day_1 默认初始化为 0。
3
4void ff(int num)
5{
6 cout << -10 * num << endl;
7}
8void ff(Week day)
9{
10 cout << static_cast<float>(10 * day) << endl;
11}
12
13int main(int argc, char** argv)
14{
15 Week day_2, day_3;
16
17 day_1 = Sun; // 或者 day_1 = Week::Sun (不限定作用域的枚举类型)
18 day_2 = day_1;
19 int i = day_1; // i = 1
20 int j = Mon; // j = 2
21
22 Week day_4(Week(100)); // day_4 = Fri
23 bool equal = (day_4 == Fri); // true
24
25 Week day_5(Week(-1)); // 越界,但是不报错,day_5 = -1 (VS 2013)
26
27 ff(1); // 匹配 ff(int),输出 -10
28 ff(day_1); // 匹配 ff(Week),输出 10
29 ff(Fri); // 匹配 ff(Week),输出 1000
30
31 return 0;
32}
17.2. 共用体
共用体(union)及其变量的定义形式与结构体类似。共用体成员访问方式也是使用运算符 .
或 ->
。
union ifcd
{
int i;
float f;
char c;
double d;
} x1, x2[5], *pu;
// 同结构体一样,分号不能丢
与结构体的异同:
存储分配方式
结构体每个成员各自占有自己的存储单元、各自的地址,结构体占有的内存空间大小是所有成员所占存储单元的总和。
共用体各个成员占用共同的存储单元,具有 相同的首地址 ,占用存储单元最多的成员的长度就是共用体的长度。一个共用体 可以包含多个不同类型的成员,但是每一时刻只有 一个成员有效 ,即最后一次存放的数据成员起作用。虽然仍然可以访问无效的成员,但是结果是未知的。
x1.i = 256; x1.c = 'A'; x1.f = 1.23; // 三步操作之后,只有 x1.f 有效。初始化
结构变量或数组可以为所有成员初始化。
共用体变量或数组在初始化时,只能初始化它的 第一个成员 ,对多个成员初始化是不允许的。
union ifcd x3 = {256}, x4[3] = {256, 256, 256}; // 对成员 i 初始化结构体和共用体可以相互出现在对方的类型定义中。
17.3. 参考资料
1.《C++ Primer 第5版 中文版》 Page 736 – 739。
C++ 枚举类型详解
C++枚举(enum)的优雅用法