C++中的union介绍

C++中的联合(Union):灵活存储多类型数据的利器 联合是一种特殊的数据结构,它允许在相同的内存空间中存储多种不同类型的成员。不同于结构体(Struct),联合的成员共享同一块内存空间。这意味着在给一个联合变量赋值时,只能使用其中的一个成员。int i;float f;char c;在上述示例中,MyUnion是一个联合类型,它包含了intfloat和char三个成员。这三个成员共享同一块内存空间,即改变其中一个成员的值会影响其他成员的值。 阅读详情

union介绍

  共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。

union与struct比较

先看一个关于struct的例子:

struct student
{
     char mark;
     long num;
     float score;
};

其struct的内存结构如下,sizeof(struct student)的值为12bytes。

下面是关于union的例子:

union test
{
     char mark;
     long num;
     float score;
};

sizeof(union test)的值为4。因为共用体将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中,而char类型和long类型所占的内存字节数是不一样的,但是在union中都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。其union类型的结构如下:

因union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。

不能如下使用:

union test a;
printf("%d", a); //错误

由于a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体变量名a,这样使编译器无法确定究竟输出的哪一个成员的值。

printf("%d", a.mark);  //正确

测试大小端

union的一个用法就是可以用来测试CPU是大端模式还是小端模式:

#include <iostream>
using namespace std;

void checkCPU()
{
    union MyUnion{
        int a;
        char c;
    }test;
    test.a = 1;
    if (test.c == 1)
        cout << "little endian" <<endl;
    else cout << "big endian" <<endl;
}

int main()
{
    checkCPU();
    return 0;
}

举例,代码如下:

#include <iostream>
using namespace std;

union test
{
     char mark;
     long num;
     float score;
}a;

int main()
{
     // cout<<a<<endl; // wrong
     a.mark = 'b';
     cout<<a.mark<<endl; // 输出'b'
     cout<<a.num<<endl; // 98 字符'b'的ACSII值
     cout<<a.score<<endl; // 输出错误值

     a.num = 10;
     cout<<a.mark<<endl; // 输出换行 非常感谢suxin同学的指正
     cout<<a.num<<endl; // 输出10
     cout<<a.score<<endl; // 输出错误值

     a.score = 10.0;
     cout<<a.mark<<endl; // 输出空
     cout<<a.num<<endl; // 输出错误值
     cout<<a.score<<endl; // 输出10

     return 0;
}

C++中union

上面总结的union使用法则,在C++中依然适用。如果加入对象呢?

#include <iostream>
using namespace std;

class CA
{
     int m_a;
};

union Test
{
     CA a;
     double d;
};

int main()
{
     return 0;
}

上面代码运行没有问题。

  如果在类CA中添加了构造函数,或者添加析构函数,就会发现程序会出现错误。由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。

C++:34---union:联合/共用体,一种节省空间的类 一、联合(union)概述联合(union)是一种特殊的类一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当我们给union的某个成员赋值之后,该union的其... 阅读详情

相关推荐

C++中union的使用方法

1 概述1.1 定义union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。例如union Token{ char cval; int ival; double dval; };以上代码定义了一个名为Token的联合,该联合中包含了3个数据成员。1.2 互斥赋值在任意时刻,联合中只能有一个数据成员可以有值。当给联合中某个成员赋值之后,...

hou09tian的博客 7万+

C/C++中的联合体union介绍

目录 union定义与简单使用 内存分配与所占空间 多种访问内存途径共存 数据存储位置 union应用之寄存器读取 union,中文名“联合体、共用体”,在某种程度上是类似结构体struct的一种数据结构,联合体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

会意的博客 4万+

PuTTY使用方法

PuTTY是一款开源SSH/Telnet客户端,主要用于Windows系统连接Linux服务器。使用步骤包括:下载安装PuTTY,输入服务器IP和端口(默认22),可选择保存会话配置。支持密码和SSH密钥认证(需转换.pem为.ppk格式)。首次连接需确认主机密钥,成功登录后可执行Linux命令。其他功能包括会话日志记录、X11转发和端口隧道配置。操作完成后输入exit断开连接。

特网云计算 3160

C、C++中union用法总结

开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这个问题,也希望大家和我讨论讨论。别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总

ny1986的专栏 4384

基于UCD3138的数字控制硬开关全桥DC-DC电源设计实战解析

在开关电源设计中,数字控制技术正逐步取代传统模拟方案,以其卓越的灵活性、可编程性和强大的数据处理能力,成为应对复杂动态响应与智能化需求的关键。其核心原理在于通过高精度模数转换器(ADC)实时采样电压、电流信号,经由数字信号处理器(如ARM内核)运行PID等控制算法,动态调整数字脉宽调制(DPWM)输出,从而实现对功率级的精确控制。这种技术价值体现在能够轻松实现高级算法(如输入电压前馈、非线性补偿)、灵活配置保护参数,并通过PMBus等接口实现智能化监控与管理。其典型应用场景包括通信基站、服务器电源以及工业设

1312

8-阿里云服务器 ECS配置R及Studio Server

步骤概览:(首先要明确自己的系统然后进行安装)

hx2024的博客 1572

C++中的union介绍:

C++的UNION

qq_51617229的博客 285

QT应用编程: Win10系统下QT5.12搭建Android开发环境(配件齐全)

在win10系统下,搭建QT5.12.6 的Android开发环境。

7689

《C Prime Plus》读书笔记(14):各种特殊数据形式总结 struct/union/enum

文章目录struct结构1. 有关struct的声明1.1 结构模板名1.2 创建结构变量1.3 与typedef的配合2. 有关struct的初始化union联合enum枚举1. enum的语法2. enum中枚举符的赋值 struct结构 1. 有关struct的声明 1.1 结构模板名 struct { // 结构的模板(勾勒一个结构) int num; char arr[10]; }; struct book{ // book为结构模板的名称 --- 模板名 int num; char

fang 0 jun的博客 376

Uniapp微信小程序:详解根据角色权限动态展示底部tabbar,支持不同身份显示不同底部导航+灵活权限组合完整源码,菜单切换不闪烁、秒加载不卡(提供动态原生Tabbar配置+自定义组件形式2种方案)

uni-app微信小程序实现根据用户不同角色显示不同的tabBar,uniapp微信小程序原生tabbar实现动态菜单导航,微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色,动态pages,uni-app微信小程序动态tabBar,根据不同用户展示不同的tabBar,uni-app微信小程序动态切换tabBar,根据不同用户角色展示不同的tabBar,微信小程序自定义底部tabbar动态修改,Uniapp小程序根据权限(角色)不同动态展示底部tabbar,解决tabbar闪烁卡顿问题,小

✅ 精选推荐文章 4284

基于STM32+Qt上位机设计的智慧停车场管理系统(207)

本项目设计了一套基于STM32+Qt上位机的智慧停车场管理系统。该系统融合了先进的嵌入式技术、图像识别技术、数据库技术和移动互联网技术,通过STM32硬件端实时采集车库现场信息,包括车牌识别、车位占用状态监测等,并将数据上传至Qt上位机进行处理与展示。利用MySQL数据库存储车辆出入库记录及车位使用情况,确保数据的安全性和可追溯性;通过Android手机APP为用户提供查询、支付等功能,实现远程交互与便捷服务。

3942

union c语言什么意思,C语言、C++中的union用法总结(包懂)

开始的话已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这个问题,也希望大家和我讨论讨论。别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总结那些看...

weixin_33426866的博客 3805

OpenAI Function Calling 实战:让 Agent 自动调用外部 API 接口

在 2023 年 6 月之前,大语言模型(LLM)的能力边界是清晰的:它能说会道,能写诗作赋,也能帮你润色文案。但如果你问它"北京现在天气怎么样",它要么答不上来,要么基于过时的训练数据给你一个错误答案。原因很简单——LLM 的训练数据是有截止日期的,它活在"过去"。2023 年 6 月,OpenAI 在 GPT-4 的更新中引入了 Function Calling 功能,彻底改变了这一局面。Function Calling(也叫 Tool Use 或工具调用)是一种让 LLM 与外部系统交互的机制。

2201_76125393的博客 88

C++之union详解

union的介绍

m0_72542983的博客 4315

FT2004(D2000)开发实战之AMD R5 230显卡驱动适配

AMD R5 230显卡驱动适配

嵌入式Linux 3200

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

走进C++11(三)“类” 类型的union

Union其实是不想介绍的一个关键字,因为union的功能即将被C++17标准中的variant所代替,而且variant更加安全。但是还是要在这里介绍一下。 union(联合体)和struct相似,也可以包含多个数据成员,但是不同的是同时只允许一个成员有效,因此经常作为作为节约空间的类使用。 C++11中union除了继承c语言的数据共享内存之外,行为上越来越像一个类,比如成员默认是public类型。 在C++11以后,很多基础语法都进行了修正。其中 union 的行为向类对象...

Max_Cong的博客 1770

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++中Union学习笔记

C++中Union学习笔记 概念 C++ union结构式一种节省空间的特殊的类,一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值,当某个成员被赋值后,其他成员变为未定义状态。 特点 Union中得默认访问权限是public。 可以含有构造函数和析构函数 能够包含访问权限、成员变量、成员函数(可以包含构造函数和析构函数)。 不能包含虚函数和静态数据变量。 它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来。 联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因

sinat_22078359的博客 421

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++11中枚举enum和union,顺带说一下内存对齐和大小端问题

这两个不太常用的小知识点,今天碰到了,所以特来总结一下。union类union X { int a; struct { short b; short c; }; }; int main(){ X x; x.a = 0x20150810; printf("%x,%x\n", x.b, x.c); retur

haolexiao的专栏 2135

【C++基础学习】C++中union结构

C++ union结构式一种特殊的类。它能够包含访问权限、成员变量、成员函数(可以包含构造函数和析构函数)。它不能包含虚函数和静态数据变量。它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来。Union中得默认访问权限是public。 在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通

计算机专业同学的充电站。 2万+

C++之struct和union对比介绍

C++之struct和union对比介绍

cnds123的专栏 1077

struct 与 union 在C与C++中的区别

在C和C++中 struct 与 union 是非常相似的,只不过 union 共享存储区而已,共享的是数据变量所占空间最大的存储区,其他和struct一样。我举以下例子来说明union在C与C++中的区别: 我用的是VS2013编译器一、在C中//本代码在C中 union Student//定义了一个Student联合体 { int a; int b; char c; }

MaHua的博客 1440

c++ 类中定义类_C++:34union:联合/共用体,一种节省空间的类

一、联合(union)概述联合(union)是一种特殊的类一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当我们给union的某个成员赋值之后,该union的其它成员就变成未定义的状态了。分配给一个union对象的存储空间至少要能容纳它的最大的数据成员类的某些特性对union同样适用,但并非所有特性都如此:union不能含有引用类型的成员,union的成员可以是...

weixin_36124888的博客 1104

在c++结构体中,union的意思是什么,作用是什么,为什么需要用union?

是一种特殊的数据结构,允许在同一内存空间中存储不同的数据类型。它的作用是允许多个成员共享同一块内存,但每次只能使用其中一个成员。的特点是在任何给定的时刻只能使用其中一个成员。因为所有成员共享同一块内存,对一个成员的修改可能会影响其他成员的值。在使用时,确保你清楚地知道哪个成员是有效的,以及何时使用哪个成员。可以帮助节省内存,特别是在需要存储多种类型数据但总体占用内存不大的情况下。例如,一个整数可以用四个字节的整数表示,也可以用四个字节的字符数组表示。的大小将等于其最大成员的大小。

weixin_50531046的博客 859

C++关键字之——union

C++关键字之——union

StephenRay的博客 5841

NanoPi R6C评测:RK3588S迷你主机散热改造与性能调优实战

ARM架构迷你主机凭借低功耗与高集成度,逐渐成为开发者构建家庭服务器和边缘计算节点的热门选择。RK3588S作为8核旗舰级SoC,融合A76大核与NPU加速,在多任务容器化部署和轻量AI推理场景中展现出独特优势。然而,实际工程落地时,被动散热导致的CPU降频、NVMe SSD过热引发的IO性能衰减,以及数据库配置不匹配等瓶颈,往往成为制约体验的关键因素。通过硬件层面的散热改造与软件层面的功耗策略调整,可显著提升系统稳定性与吞吐能力。梳理从基准测试到长期运行的调优路径,能为ARM服务器场景下的性能优化提供参考

weixin_34007906的博客 221
上一篇: ​C++中的STL中map用法详解​
下一篇: C++ vector的使用、创建及初始化
std7879
博客等级 码龄5年 273粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

std7879

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值