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;  // 所有字段都相同
}
相关推荐
_OP_CHEN3 小时前
C++基础:(十六)priority_queue和deque的深度解析
开发语言·c++
C++ 老炮儿的技术栈3 小时前
include″″与includ<>的区别
c语言·开发语言·c++·算法·visual studio
BS_Li3 小时前
C++IO库
c++·io流
CHANG_THE_WORLD3 小时前
PDFium导出pdf 图像
开发语言·c++·pdf
Larry_Yanan3 小时前
QML学习笔记(四十三)QML与C++交互:上下文属性暴露
c++·笔记·qt·学习·ui·交互
owCode3 小时前
4-C++智能指针
开发语言·c++
liu****4 小时前
10.queue的模拟实现
开发语言·数据结构·c++·算法
宋恩淇要努力4 小时前
C++多态
c++
让我们一起加油好吗4 小时前
【基础算法】01BFS
数据结构·c++·算法·bfs·01bfs