C++——自定义数据类型(联合体)_(了解即可,现在多用struct替代)

联合体 (union):共享内存的特殊数据类型

  • 什么是联合体?

    • 联合体是一种特殊的数据类型,它允许在同一块内存空间存储不同类型的数据。 这意味着,联合体的所有成员共享同一块内存,任何时候只能有一个成员存储有效的值。
    • 你可以把联合体想象成一个"房间",这个房间可以用来存放不同类型的"物品",但一次只能存放一件"物品"。
  • 定义联合体

    c++ 复制代码
    union Data {
        int intValue;
        float floatValue;
        char stringValue[20];
    };
    • union 关键字表明我们正在定义一个联合体。
    • Data 是这个联合体的名称。
    • 花括号 {} 内部定义了联合体的成员。
  • 使用联合体

    c++ 复制代码
    #include <iostream>
    #include <cstring>
    
    union Data {
        int intValue;
        float floatValue;
        char stringValue[20];
    };
    
    int main() {
        Data data;
    
        // 存储整数值
        data.intValue = 100;
        std::cout << "intValue: " << data.intValue << std::endl;
    
        // 存储浮点数值,此时 intValue 的值不再有效
        data.floatValue = 3.14f;
        std::cout << "floatValue: " << data.floatValue << std::endl;
        // 此时访问 data.intValue 将会得到未定义的值
    
        // 存储字符串值,之前的值都不再有效
        strcpy(data.stringValue, "Hello");
        std::cout << "stringValue: " << data.stringValue << std::endl;
    
        return 0;
    }
    • 联合体的大小由其最大的成员的大小决定。
    • 当给联合体的一个成员赋值时,其他成员的值会变得无效。 你需要清楚地知道当前联合体中哪个成员存储了有效的值。
  • 联合体的应用场景

    • 节省内存空间: 当需要在不同的时间存储不同类型的数据,但这些数据不会同时使用时,可以使用联合体来节省内存。
    • 类型双关 (Type Punning): 在某些底层编程或需要直接操作内存的情况下,可以使用联合体来查看同一块内存的不同类型解释,但这需要非常小心,避免出现未定义的行为。
    • 与结构体结合使用: 联合体常常与结构体结合使用,例如,在一个表示消息的结构体中,消息的内容可能是不同的类型,可以使用联合体来存储不同类型的消息内容。
  • 使用联合体的注意事项

    • 由于联合体的成员共享内存,因此在给一个成员赋值后,其他成员的值会变得无效。你需要维护当前有效成员的信息。
    • 联合体不能包含带有构造函数或析构函数的类类型的成员,除非这些构造函数和析构函数是平凡的 (trivial)。
    • 使用联合体需要谨慎,确保你清楚地知道当前存储在联合体中的数据类型,避免数据错误。
相关推荐
神奇的程序员5 小时前
从已损坏的备份中拯救数据
运维·后端·前端工程化
oden6 小时前
AI服务商切换太麻烦?一个AI Gateway搞定监控、缓存和故障转移(成本降40%)
后端·openai·api
李慕婉学姐7 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_740043737 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
招风的黑耳8 小时前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
Miss_Chenzr8 小时前
Springboot优卖电商系统s7zmj(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
期待のcode8 小时前
Springboot核心构建插件
java·spring boot·后端
2501_921649498 小时前
如何获取美股实时行情:Python 量化交易指南
开发语言·后端·python·websocket·金融
serendipity_hky9 小时前
【SpringCloud | 第5篇】Seata分布式事务
分布式·后端·spring·spring cloud·seata·openfeign
五阿哥永琪9 小时前
Spring Boot 中自定义线程池的正确使用姿势:定义、注入与最佳实践
spring boot·后端·python