共用体和枚举

共用体

共用体(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被称为枚举(enumeration),是一种新类型(类似于int、long、double等类型),就像struct变量被称为结构一样。
  • red、orange、yellow等作为符号常量,依次对应整数0~7,称为枚举量。(默认情况下第一个枚举量为0,第二个枚举量为1)

创建枚举变量

创建枚举变量

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在枚举的取值范围之内,可以使用

猜你喜欢

转载自www.cnblogs.com/bubcs/p/13379673.html