共用体(union)是一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型。例如:结构可以同时存储int、long和double,共用体只能存储int、long或double。用法与结构类似。
union one4all
{
int int_val;
long long_val;
double doubel_val;
};
//可以使用one4all变量来储存int、long或doubel,前提是在不同的时间使用
one4all pail;
pail.int_val = 15;
cout << pail.int_val;
pail.double_val = 1.38;
cout << pail.double_val;
因为共用体每次只能存储一个值,因此必须有足够的空间来存储最大的成员。
当数据项使用两种或更多格式(但不会同时使用)时,可节省空间。例如:一些商品的ID为整数,而另一些为字符串时,可以进行下面的方法:
struct widget =
{
char brand[20];
int type;
union id
{
long id_num;
char id_char[20];
}id_val; //定义共用体的同时,创建了一个共用体类型的id_val变量
};
...
widget prize;
...
if (prize.type == 1)
cin >> prize.id_val.id_num;
else
cin >> prize.id_val.id_char;
匿名共用体没有名称,其成员将成为位于相同地址处的变量。
struct widget =
{
char brand[20];
int type;
union id
{
long id_num;
char id_char[20];
}; //定义共用体的同时,创建了一个共用体类型的id_val变量
};
...
widget prize;
...
if (prize.type == 1)
cin >> prize.d_num;
else
cin >> prize.id_char;
//id_num和id_char被视为prize的两个成员,它们地址相同
C++的enum工具提供了另一种创建符号常量的方式,可以用来替代const。定义 枚举方式如下:
enum spectrum {red,orange,yellow,green,blue,violet,indigo,ultraviolet};
创建枚举变量
spectrum band; //创建一个spectrum类型的枚举变量
band = blue; //意为将bule对应的4赋给band
band = 2000; //错误,只能将定义枚举时的枚举常量赋给枚举变量,所以受spectrum影响band只有8个可能值
band = spectrum(3); //等同于将3赋给band,前提是()内的int值是在定义的枚举量中才行
对于枚举,只定义了赋值运算符,没有算术运算符
band = orange; //正确
++band; //错误
band = orange + red; //错误
而且,枚举量是整型,可以被提升为int类型,但是int类型不可以转换为枚举类型
int color = blue; //blue是枚举常量,color是int变量
band = 3; //3是int类型,band是枚举类型,不能将int转换为枚举
color = 3 + red; //正确使用,运算前red由枚举类型转换为int类型,再进行运算
band = orange + red; //错误使用,枚举没有算术运算符,且运算前orange和red转换为int类型了
使用赋值运算符来显式地设置枚举量的值:
enum bits {one = 1, two = 2, four = 4, eight = 8}; //指定的值必须是整数
enum bigstep {first, second = 100, third}; //first默认为0,没被初识化的枚举量的值比前面的枚举量大1,故third值为101
enum spectrum {zero, null = 0, one, numero_uno = 1}; //这属于正确设置枚举量的值
enum bigstep {first, second = 100, third};
枚举取值范围的定义:上限,找出枚举量的最大值,然后找到大于这个最大值的、最小的2的幂,将他减1,例如:bigstep中最大枚举值是101,在2的幂中,比这个数大的最小值为128,因此取值范围为127;下限,找出枚举量的最小值,如果它不小于0,则取值范围下限为0,否则,采用与寻找上限一样的方式,弹药加上负号,例如:如果最小值是-6,而比它小的、最大的2的幂是-8,因此下限为-7。
enum bits {one = 1, two = 2, four = 4, eight = 8};
bits myflag;
myflag = bits(6); //属于正确的赋值,虽然6不是枚举值,但6在枚举的取值范围之内,可以使用
原文:https://www.cnblogs.com/bubcs/p/13379673.html