目录
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; // 所有字段都相同
}