C++共用体的介绍

2024-06-07 00:18
文章标签 c++ 介绍 共用

本文主要是介绍C++共用体的介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元中(见图7.12)。

图7.12

以上3个变量在内存中占的字节数不同,但都从同一地址开始存放。也就是使用覆盖技术,几个变量互相覆盖。这种使几个不同的变量共占同一段内存的结构,称为共用体(union )类型的结构(有些书译为联合)。

声明共用体类型的一般形式为:
    union 共用体类型名{成员表列};

定义共用体变量的一般形式为:
    共用体类型名 共用体变量名;

当然也可在声明共用体类型的同时定义共用体变量,也可没有共用体类型名而直接定义共用体变量。例如可以看到,“共用体”与“结构体”的定义形式相似。但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。

共用体变量的访问方式

不能引用共用体变量,而只能引用共用体变量中的成员。例如,下面的引用方式是正确的:
    a.i  (引用共用体变量中的整型成员i)
    a.ch  (引用共用体变量中的字符型成员ch)
    a.f  (引用共用体变量中的双精度型成员d)

不能只引用共用体变量,例如
    cout<<a;
是错误的,应该写成
    cout<<a.i;

    cout<<a.ch;
等。

共用体类型数据的特点

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

【例7.7】设有若干个人员的数据,其中有学生和教师。学生的数据中包括: 姓名、号码、性别、职业、年级。教师的数据包括: 姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。

现要求把它们放在同一表格中,如果job项为s(学生),则第5项为grade(年级)。即Li是3年级的。如果job项是t(教师),则第5项为position(职务)。Wang是prof(教授)。显然对第5项可以用共用体来处理(将class和position放在同一段内存中)。要求输入人员的数据,然后再输出。为简化起见,只设两个人(一个学生、一个教师)。

程序如下:
  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>//因为在输出流中使用了控制符setw
  4. using namespace std;
  5. struct
  6. {
  7. int num;
  8. char name[10];
  9. char sex;
  10. char job;
  11. union P //声明共用体类型
  12. {
  13. int grade; //年级
  14. char position[10]; //职务
  15. }category; //成员category 为共用体变量
  16. }person[2]; //定义共用体数组person,含两个元素
  17. int main( )
  18. {
  19. int i;
  20. for(i=0;i<2;i++) //输入两个学生的数据
  21. {
  22. cin>>person[i].num>>person[i].name
  23. >>person[i].sex>>person[i].job;
  24. if(person[i].job=='s')
  25. cin>>person[i].category.grade; //若是学生则输入年级
  26. else
  27. if (person[i].job=='t')
  28. cin>>person[i].category.position; //若是教师则输入职务
  29. }
  30. cout<<endl<<"No. Name sex job grade/position"<<endl;
  31. for(i=0;i<2;i++)
  32. {
  33. if (person[i].job=='s') cout<<person[i].num<<setw(6)
  34. <<person[i].name<<" "<<person[i].sex <<" "
  35. <<person[i].job<<setw(10)<<person[i].category.grade<<endl;
  36. else cout<<person[i].num<<setw(6)<<person[i].name
  37. <<" "<<person[i].sex <<" "<<person[i].job
  38. <<setw(10)<<person[i].category.position<<endl;
  39. }
  40. return 0;
  41. }
运行情况如下:
101 Li fs 3↙ (注意在输入的字母f和s之间无空格)
102 Wang mt prof↙ (注意在输入的字母m和t之间无空格)
No. Name sex job grade/position 101 Li f s 3 102 Wang m t prof

为了使输出结果上下对齐,在cout语句中用了setw控制符和插入空格。往往需要试验多次。

这篇关于C++共用体的介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037644

相关文章

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3