C++之理解共用体
目录
1、共用体特点
2、实例1:赋值
3、实例2:覆盖赋值问题
4、实例3:商品用户ID
5、完整产品案例(共用体+结构体)
1、共用体特点
共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。
也就是说,共用体只能存储int、long或double,而结构体可以同时存储int、long和double。
共用体的语法与结构体相似,但含义不同。
2、实例1:赋值
共用体中的a进行赋值,共用体中的b也可以使用。
#include <stdio.h>
union node
{int a;char b;
};
int main()
{union node Node;Node.a = 1; //对共用体中的a进行赋值,共用体中的b也可以使用。a=b=1printf("b = %d\n", Node.b); //a=b=1return 0;
}
3、实例2:覆盖赋值问题
可以使用one4all变量来存储int、long或double,条件是在不同的时间进行.
共用体的长度为最大成员长度
#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; //15pall.double_val = 1.38; cout<<pall.double_val<<endl; //1.38 int_val被double_val覆盖 return 0;
}
4、实例3:商品用户ID
商品用户ID(有可能为整数或字符串——采用共用体):
#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、完整产品案例(共用体+结构体)
#include <iostream>
#include <cstring>
using namespace std; // 定义产品结构体
struct widget
{char brand[20]; // 产品品牌名称,字符数组存储int type; // 产品类型,用于决定使用共用体的哪个成员// 内嵌共用体定义,用于存储不同类型的IDunion 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;// 根据类型输入不同的IDif(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;// 根据类型比较IDif(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; // 所有字段都相同
}