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。

  1. C++ 枚举类型详解

  1. C++枚举(enum)的优雅用法