C++之理解共用体

目录

1、共用体特点

2、实例1:赋值

3、实例2:覆盖赋值问题

4、实例3:商品用户ID

5、完整产品案例(共用体+结构体)


1、共用体特点

共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。

也就是说,共用体只能存储int、long或double,而结构体可以同时存储int、long和double。

共用体的语法与结构体相似,但含义不同。

2、实例1:赋值

共用体中的a进行赋值,共用体中的b也可以使用。

cpp 复制代码
#include <stdio.h>
union node
{
    int a;
    char b;
};
int main()
{
    union node Node;
    
    Node.a = 1; //对共用体中的a进行赋值,共用体中的b也可以使用。a=b=1

    printf("b = %d\n", Node.b);  //a=b=1

    return 0;
}

3、实例2:覆盖赋值问题

可以使用one4all变量来存储int、long或double,条件是在不同的时间进行.

共用体的长度为最大成员长度

cpp 复制代码
#include <stdio.h>
#include <iostream>
using namespace std;
union one4all
{
    int int_val;
    long long_val;
    double double_val;
};
int main(){
	one4all pall;
	
    pall.int_val = 15;    
    cout<<pall.int_val<<endl;   //15
    
    pall.double_val = 1.38;    
    cout<<pall.double_val<<endl;   //1.38   int_val被double_val覆盖 
    return 0;
}

4、实例3:商品用户ID

商品用户ID(有可能为整数或字符串------采用共用体):

cpp 复制代码
#include <iostream>
using namespace std;
struct widget
{
    char brand[20];
    int type;
    
    union id
    {
        long id_num;  //一些ID为整数
        char id_char[20];  //而另一些的ID为字符串
    }id_val;
};
int main(){
	
    widget prize;
    
    cout << "请输入type (1-数字, 其他数字-字符串): ";
    cin >> prize.type;
    
    if(prize.type == 1)
    {
        cout << "请输入数字ID: ";
        cin >> prize.id_val.id_num;
        cout << "数字类型:" << prize.id_val.id_num << endl; 
    }
    else
    {
        cout << "请输入字符串ID: ";
        cin >> prize.id_val.id_char;
        cout << "字符串类型:" << prize.id_val.id_char << endl;
    }
    
    return 0;
}

显示结果:

请输入type (1-数字, 其他数字-字符串): 1

请输入数字ID: 1

数字类型:1

5、完整产品案例(共用体+结构体)

cpp 复制代码
#include <iostream>    
#include <cstring>    
using namespace std;   

// 定义产品结构体
struct widget
{
    char brand[20];    // 产品品牌名称,字符数组存储
    int type;          // 产品类型,用于决定使用共用体的哪个成员
    
    // 内嵌共用体定义,用于存储不同类型的ID
    union id
    {
        long id_num;      // 一些产品的ID为整数类型
        char id_char[20]; // 另一些产品的ID为字符串类型
    } id_val;  // 声明共用体变量名为id_val
};

// 函数声明
widget inputWidgetInfo();                    // 输入产品信息
void displayWidgetInfo(widget product);      // 显示产品信息
widget createDefaultWidget();                // 创建默认产品

int main()
{
    cout << "=== 产品信息管理系统 ===" << endl; 
    
    cout << "\n--- 输入产品信息 ---" << endl; 
    cout << "提示:输入类型为0将显示默认产品" << endl;
    widget prize = inputWidgetInfo(); 
    
    cout << "\n=== 显示产品信息 ===" << endl;
    displayWidgetInfo(prize);
    
    // 演示共用体的内存特性
    cout << "\n=== 内存大小信息 ===" << endl;
    cout << "整个结构体大小: " << sizeof(widget) << " 字节" << endl;
    cout << "共用体大小: " << sizeof(widget::id) << " 字节" << endl;
    cout << "long类型大小: " << sizeof(long) << " 字节" << endl;
    cout << "char[20]大小: " << sizeof(char[20]) << " 字节" << endl;
    
    

    cout << "\n=== 多个产品管理 ===" << endl;
    widget products[2];  // 创建产品数组
    
    // 为每个产品输入信息
    for(int i = 0; i < 2; i++) {
        cout << "\n请输入第 " << i + 1 << " 个产品信息:" << endl;
        cout << "提示:输入类型为0将显示默认产品" << endl;
        products[i] = inputWidgetInfo();  
    }
    
    // 显示所有产品信息
    cout << "\n=== 所有产品信息 ===" << endl;
    for(int i = 0; i < 2; i++) {
        cout << "\n第 " << i + 1 << " 个产品:" << endl;
        displayWidgetInfo(products[i]);  
    }
    
    return 0;  
}

// 输入产品信息的函数 
widget inputWidgetInfo()
{
    widget product; 
    
    cout << "请输入产品品牌: ";
    cin >> product.brand;
    
    cout << "请选择产品类型 (0-默认产品, 1-数字ID, 2-字符串ID): ";
    cin >> product.type;
    
    // 根据类型输入不同的ID
    if(product.type == 0) 
    {
        // 如果用户输入0,返回默认产品
        cout << "已选择默认产品,使用预设值..." << endl;
        return createDefaultWidget();
    }
    else if(product.type == 1)
    {
        cout << "请输入数字ID: ";
        cin >> product.id_val.id_num;
    }
    else if(product.type == 2)
    {
        cout << "请输入字符串ID: ";
        cin >> product.id_val.id_char;
    }
    else
    {
        // 如果输入了其他数字,也返回默认产品
        cout << "无效类型,使用默认产品..." << endl;
        return createDefaultWidget();
    }
    
    return product;  
}


// 显示产品信息的函数
void displayWidgetInfo(widget product)
{
    // 显示基本品牌信息
    cout << "产品品牌: " << product.brand << endl;
    cout << "产品类型: " << product.type;
    
    // 根据类型显示相应的ID信息
    if(product.type == 0 || product.type == 1)
    {
        cout << " (数字ID)" << endl;
        cout << "数字ID: " << product.id_val.id_num << endl;
    }
    else if(product.type == 2)
    {
        cout << " (字符串ID)" << endl;
        cout << "字符串ID: " << product.id_val.id_char << endl;
    }
    else
    {
        cout << " (未知类型)" << endl;
        cout << "ID: 无效" << endl;
    }
    cout << "------------------------" << endl;
}

// 创建默认产品
widget createDefaultWidget()
{
    widget defaultProduct;  // 创建默认产品
    
    // 设置默认值
    strcpy(defaultProduct.brand, "DefaultBrand");
    defaultProduct.type = 1;
    defaultProduct.id_val.id_num = 10001;
    
    return defaultProduct;  // 返回默认产品
}

// 比较两个产品是否相同的函数
bool isWidgetEqual(widget product1, widget product2)
{
    // 比较品牌
    if(strcmp(product1.brand, product2.brand) != 0)
        return false;
    
    // 比较类型
    if(product1.type != product2.type)
        return false;
    
    // 根据类型比较ID
    if(product1.type == 1)
    {
        if(product1.id_val.id_num != product2.id_val.id_num)
            return false;
    }
    else
    {
        if(strcmp(product1.id_val.id_char, product2.id_val.id_char) != 0)
            return false;
    }
    
    return true;  // 所有字段都相同
}
相关推荐
坤坤子吖2 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
一晌小贪欢2 小时前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚3 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
·present·3 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
旖旎夜光4 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
青少儿编程课堂6 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
白杨尚青6 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
旖旎夜光7 小时前
【C++ 基础入门】C++ 继承(上):概念、切片、隐藏、默认成员函数与友元
c++·笔记·学习
apcipot_rain8 小时前
C++转Java日记(05)
java·开发语言·c++