美文网首页
C++<第十三篇>:共用体与枚举

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

作者: NoBugException | 来源:发表于2022-01-20 16:05 被阅读0次

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

一、共用体

(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个字节。

[本章完...]

相关文章

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

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

  • 14 C共用体 && 枚举

    1、why共用体 2、枚举

  • NDK开发—结构体、共用体与C++基础(三)

    目录 结构体、共用体与C++基础11、结构体字节对齐2、共用体3、C++ 输出函数符号兼容引用字符串C字符串字符串...

  • C++ - 用户自定义数据类型

    C++允许用户根据需要自己声明一些类型,包括数组、结构体类型、共用体类型、枚举类型、类类型 结构体类型 在一个组合...

  • 第四章 复合类型(5)共用体与枚举

    (五)共用体与枚举 1.共用体(union) 共用体是一种数据格式,它能够存储不同的数据类型,但在同一时刻只能存...

  • 王道程序员求职宝典(四)结构体,共用体与枚举

    结构体,共用体与枚举 结构体结构体定义一些特性可继承访问方式构造/析构函数定义递归嵌套初始化结构体位字段整型或枚举...

  • Day11

    共用体 枚举 枚举的基本概念 枚举的作用域枚举作用域和结构体作用域一样, 定义枚举变量和结构体一样 局部变量和全局...

  • C++的共用体使用场景

    C++使用union 描述 union是C语言中一种声明共用体的数据类型,使用union声明的共用体只会占用共用体...

  • C结构体、共用体、枚举

    一、结构体 (1)类型声明 注意,这一步操作只是声明了一个类型struct student,不占据栈空间或堆空间。...

  • Day7

    学习内容:结构体、共用体、枚举(1/2)收获: 了解了结构体变量的定义与使用 了解了结构体数组的使用; 了解了结构...

网友评论

      本文标题:C++<第十三篇>:共用体与枚举

      本文链接:https://www.haomeiwen.com/subject/vxqdhrtx.html