C++<第十三篇>:共用体与枚举

2022-01-20  本文已影响0人  NoBugException

共用体和结构体很相似,它像一个存储空间可变的数据类型,使程序设计更加灵活。
枚举则是特殊的常量,增加代码的可读性。
结构体、共用体和枚举称为自定义类型,能够增加代码的复用性。

一、共用体

(1)共用体类型的一般形式为:

 union 共用体类型名
{
    成员类型  共用体成员名1;
    成员类型  共用体成员名2;
    ...
    成员类型  共用体成员名n;
 }

(2)共用体的定义和声明

union 是定义共用体数据类型的关键字,共用体类型名是一个标识符,该标识符以后就是一个新的数据类型,成员类型是常规的数据类型,用来设置共用体成员的存储空间。

【第一种方式】 先定义共用体,然后声明共用体变量

union MyUnion
{
    int a;
    char b;
    float c;
};

MyUnion myUnion;

【第二种方式】 可以直接在定义时声明共用体变量

union MyUnion
{
    int a;
    char b;
    float c;
}myUnion;

【第三种方式】 可以直接声明共用体变量

union
{
    int a;
    char b;
    float c;
}myUnion;

第三种方式省略了共用体类型名。

(3)共用体的初始化

共用体的初始化方式和结构体相同,但共用体只能初始化一个值:

union MyUnion
{
    int a;
    char b;
    float c;
}myUnion = {'A'};

这种方式赋值可能存在问题,推荐使用下列方式:

union MyUnion
{
    int a;
    char b;
    float c;
}myUnion;

myUnion.b = 'A';

尽管共用体中有多个成员变量,但是却是多个成员共用一个存储空间。

第一种方式直接在括号中存放一个字符 ‘A’,共用体只有一个存储空间,只能存放一个变量,a、b、c 共用一个存储空间。

下面举个例子来说明

union MyUnion
{
    int a;
    char b;
    float c;
}myUnion = {'A'};

cout << myUnion.a << endl;
cout << myUnion.b << endl;
cout << myUnion.c << endl;

以上代码输出 a、b、c 的值

65
A
9.10844e-44

将65强转成字符,结果是字符‘A’。

(4)共用体的大小

共用体的大小可以使用sizeof函数来测量。

union MyUnion
{
    int a;
    char b;
    long long c;
}myUnion;

cout << sizeof(myUnion.a) << endl;
cout << sizeof(myUnion.b) << endl;
cout << sizeof(myUnion.c) << endl;
cout << sizeof(myUnion) << endl;

打印结果是:

4
1
8
8

a的大小是4字节,b的大小是1字节,c的大小是8字节,整理的大小是8字节。

共用体所有的成员共用一个存储空间,共用体存储空间的大小取决于最大成员的大小。

(5)共用体的特点

(1)使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据,但请注意,在同一时间只能存放其中一种,而不是同时存放几种。
(2)能够被访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。
(3)共用体变量的地址和它的各成员的地址都是同一个地址。
(4)不能对共用体变量名赋值,不能企图引用变量名来得到一个值,不能在定义共用体变量时对它初始化,不能用共用体变量名做为函数参数。
二、枚举类型

(1)枚举的一般形式

enum 枚举类型名  {标识符列表}

(2)枚举类型的声明

enum Weekday
{
    Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
};

enum 是定义枚举类型的关键字,weekday 是枚举类型名,大括号内是枚举类型变量的值。

假如,我们直接将枚举值输出:

enum Weekday
{
    Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
};

cout << Sunday << endl;
cout << Monday << endl;
cout << Tuesday << endl;
cout << Wednesday << endl;
cout << Thursday << endl;
cout << Friday << endl;
cout << Saturday << endl;

打印结果:

0
1
2
3
4
5
6

枚举类型的值默认是从0开始的,逐渐叠加。

枚举还可以主动赋值,代码如下:

enum Weekday
{
    Sunday = 7,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6
};

利用枚举值自动加一的特性,我们还可以部分赋值:

enum Weekday
{
    Sunday = 7,
    Monday = 1,
    Tuesday = 2,
    Wednesday,
    Thursday,
    Friday,
    Saturday
};

Wednesday、Thursday、Friday、Saturday 的值分别是 3、4、5、6。

(3)枚举变量

enum Weekday day;

在 C 中,声明一个枚举变量前面需要添加 enum 关键字,在 C++ 中, enum 关键字可以省略。

枚举数据打印出来虽然是整型数据,但是day不能直接赋值为整型:

day = 3;

以上的赋值是错误的,我们需要将整型强转成枚举类型:

day = (enum Weekday)3;

如果不想强转,那么直接赋值枚举数据:

day = Wednesday;

(4)枚举类型的运算

枚举类型是可以比较的:

enum Weekday day1, day2;

day1 = Wednesday;
day2 = Thursday;

if (day1 > day2) {
    cout << "A" << endl;
}
else if (day1 < day2)
{
    cout << "B" << endl;
}
else
{
    cout << "C" << endl;
}

枚举类型也可以遍历,由于枚举的值自动增1,所以遍历枚举成为可能,代码如下:

enum Weekday
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday3,
    Thursday,
    Friday,
    Saturday
};

for (enum Weekday day = Sunday; day <= Saturday; day = (enum Weekday)(day + 1))
{
    switch (day)
    {
    case Sunday:
        cout << "星期日" << " ";
        break;
    case Monday:
        cout << "星期一" << " ";
        break;
    case Tuesday:
        cout << "星期二" << " ";
        break;
    case Wednesday3:
        cout << "星期三" << " ";
        break;
    case Thursday:
        cout << "星期四" << " ";
        break;
    case Friday:
        cout << "星期五" << " ";
        break;
    case Saturday:
        cout << "星期六" << " ";
        break;
    default:
        break;
    }
}

执行结果是:

星期日 星期一 星期二 星期三 星期四 星期五 星期六

(5)枚举类型的大小

枚举类型的大小是由枚举元素最大所占的内存大小来决定的。

没有任何赋值的枚举大小占用4个字节,演示代码如下:

enum Weekday{Sunday,Monday,Tuesday,Wednesday3,Thursday,Friday,Saturday};

cout << sizeof(Weekday) << endl;

枚举的大小,其实就是枚举元素的大小(整型常量的大小),一般占用4个字节。

[本章完...]

上一篇 下一篇

猜你喜欢

热点阅读