C++数据类型:联合体(union)
一. 定义与基本概念
1. 定义语法
在C++中,联合体(union)是一种特殊的数据类型,它的定义以union关键字开始,后面跟着联合体的名称和花括号内的成员列表。例如:
union MyUnion { int num; char ch; };
这里定义了一个名为MyUnion的联合体,它包含两个成员:一个int类型的num和一个char类型的ch。
2. 存储特性
联合体的所有成员共享同一块内存空间。这意味着联合体的大小等于其最大成员的大小。在上面的例子中,假设int类型占4个字节,char类型占1个字节,那么MyUnion联合体的大小就是4个字节。
二. 成员访问与使用
1. 成员访问
可以使用成员访问运算符(.)来访问联合体的成员。例如:
MyUnion u; u.num = 10; std::cout << u.num << std::endl; u.ch = 'a'; std::cout << u.ch << std::endl;
需要注意的是,由于联合体成员共享内存空间,在使用时要谨慎,确保在某一时刻只有一个成员被正确使用。如果在给一个成员赋值后,又给另一个成员赋值,那么之前成员的值就会被覆盖。
2. 用途
联合体常用于节省内存空间,特别是在某些情况下,程序在不同的时间点需要使用同一块内存存储不同类型的数据。例如,在处理一个数据结构时,根据某个标志位的值,可能需要将同一块内存解释为不同类型的数据。
三. 联合体与结构体的区别
1. 存储方式
结构体的每个成员都有自己独立的存储空间,结构体的总大小是所有成员大小之和(考虑内存对齐)。而联合体所有成员共享同一块存储空间,其大小等于最大成员的大小。
例如,对于结构体:
struct MyStruct { int num; char ch; };
MyStruct结构体的大小是int类型大小加上char类型大小(考虑内存对齐),可能大于联合体MyUnion的大小。
2. 成员使用逻辑
在结构体中,可以同时使用多个成员,它们相互独立。而在联合体中,在某一时刻只能使用其中一个成员,因为它们共享内存空间,对一个成员的赋值会影响其他成员的值(如果有其他成员被使用的话)。
四. 匿名联合体(C++11及以上)
1. 定义与特性
在C++11及以上版本中,可以定义匿名联合体。匿名联合体没有名称,并且它的成员可以直接被访问,就好像它们是定义在周围作用域中的普通变量一样。例如:
union { int num; char ch; }; num = 10; std::cout << num << std::endl; ch = 'a'; std::cout << ch << std::endl;
匿名联合体的主要作用是方便在局部作用域内创建简单的数据共享结构,避免了定义一个有名称的联合体再进行访问的繁琐过程。但是要注意,由于成员直接在作用域内可访问,要避免命名冲突等问题。
C++编程语言基础
- C++:从入门到工作的教程
- 这是我的第一个 C++程序!
- C++中main函数有什么作用?
- C++中 #include 指令的作用
- C++中常用的预处理指令
- C++中 iostream 头文件定义了什么
- C++名称空间(namespace)
- C++标准库中 std 命名空间定义了些什么
- C++常用的头文件
- C++源代码的发布方式
- C++变量名的定义、变量的作用、使用规范
- C++的关键字列表
- C++数据类型:整型(整数类型)
- 二进制补码、原码、反码
- C++数据类型:char字符型(整数类型)
- ASCII码表及C++字符函数库(cctype)
- 计算机汉字编码
- C++数据类型:bool类型(整数类型)
- C++中 const 限定符
- C++数据类型:浮点数
- C++运算符:算术运算符
- C++运算符:类型转换规则
- 计算机数据存储大小端模式
- C++运算符:位运算 与 bitset类库
- C++运算符:关系运算符与逻辑运算符
- C++流程控制:顺序、选择、循环、跳转语句
- C++函数的定义、参数传递、重载、嵌套
- C++数组:一维、二维、多维数组的运用
- C-style字符串、库函数 与 std::string对象
- C++数据类型:结构体(struct)
- C++数据类型:联合体(union)
- C++数据类型:枚举(enum)
- C++数据类型别名:typedef
- C++指针
- C++内存操作符:new分配 与 delete释放
- C++标准模板库(STL)容器、算法、迭代器
- C++标准模板库(STL)vector顺序容器
- C++标准模板库(STL)array固定容器
- C++标准模板库(STL)list双向链表容器
- C++标准模板库(STL)deque双端队列
- C++标准模板库(STL)集合 set 关联容器
- C++标准模板库(STL)map关联容器
- C++标准模板库(STL)unordered_set
- C++标准模板库(STL)unordered_map
- C++标准模板库(STL)algorithm算法库
- C++文件操作
- C++数学库(cmath)数学常量与数学函数
- C++模板:函数模板、类模板
- C++与SQLite3联合打造实用的应用程序
- C++实战开发中常用的库(概述)
- 第二部分:C++面向对象编程
- C++:类的定义与声明、类对象应用
- 第三部分:数据结构与算法(概述)
- 第一部分:C++语言简介与学习路线