1.共用体union
①形式和结构体相似,但是每次只能存储共用体中的一种类型的数据;
#include<iostream>
using namespace std;
int main()
{
//创建共用体数据类型uns
union uns
{
int a;
float b;
double c;
};
uns un1; //声明uns型数据un1;
un1.a = 2;
cout<<"un1.a = "<<un1.a<<endl;
un1.b = 3.4; //此时2这个int值以及被丢弃了,un1里面只存在float 的3.4
cout<<"un1.b = "<<un1.b<<endl;
un1.c = 5.88;//b被丢弃
cout<<"un1.c = "<<un1.c<<endl;
cout<<"un1.a = "<<un1.a<<endl;//测试un1.a里面是啥
}
/************************运行结果**********************************
un1.a = 2
un1.b = 3.4
un1.c = 5.88
un1.a = -1202590843
******************************************************************/
②共用体有点:节省空间、方便数据类型转换
③一点疑问:既然共用体每次只能存储一个数据,为什么不直接cout<<un1;呢?
虽然编译器不会自动帮我们实现,但是是可以自己动手实现的
下面代码写了一个辅助函数,可以直接cout<<u;而不用指定成员
#include <iostream>
union MyUnion {
int intValue;
float floatValue;
char charValue;
};
std::ostream& operator<<(std::ostream& os, const MyUnion& u) {
if (/* 判断共用体当前存储的是哪种类型 */) {
os << u.intValue;
} else if (/* 判断共用体当前存储的是哪种类型 */) {
os << u.floatValue;
} else if (/* 判断共用体当前存储的是哪种类型 */) {
os << u.charValue;
}
return os;
}
int main() {
MyUnion u;
u.intValue = 42;
std::cout << u << std::endl;
u.floatValue = 3.14f;
std::cout << u << std::endl;
u.charValue = 'A';
std::cout << u << std::endl;
return 0;
}
2.枚举enum
表面上来看枚举看起来很没有用,它把0、1、2、3...换个名称存起来,但是,在C++中,枚举(Enum)是一种用于定义命名常量的数据类型。枚举允许你创建一组具有特定名称的常量,这些常量通常代表一些有限的离散值。枚举可以提高代码的可读性和可维护性,使得代码更易于理解。
#include <iostream>
// 定义一个枚举类型
enum Color
{
RED,
GREEN,
BLUE
};
int main()
{
// 声明一个枚举变量并赋值
Color selectedColor = GREEN;
// 使用枚举常量进行条件判断
if (selectedColor == RED)
{
std::cout << "选中的颜色是红色" << std::endl;
}
else if (selectedColor == GREEN)
{
std::cout << "选中的颜色是绿色" << std::endl;
}
else if (selectedColor == BLUE)
{
std::cout << "选中的颜色是蓝色" << std::endl;
}
else
{
std::cout << "未知的颜色" << std::endl;
}
return 0;
}
上述代码,当然可以用if(selectedcolor == 0)、if(selectedcolor == 1)、if(selectedcolor == 2)来判断,但是可读性将会变差;另外枚举也会限制color的取值范围,这对程序运行有好处