C++每日一课(十三)

共用体


共用体(union),它是一种数据格式,可以存储不同的数据类型,但是请注意它同一时刻只能存储其中一种类型的数据。
声明格式


union u
{
    int int_val;
    long long_val;
    double double_val;
};


可以使用u来存储变量int,long或者是double,当然在一个时间只能存储其中一种


u u1;
u1.int_val = 1; //这个时候存储的是int类型数据
cout<<u1.int_val;


u1.double_val = 1.1; //这个时候存储的是double类型数据
cout<<u1.double_val;


因为共用体一次只能存储一个值,因而它必须要有足够的空间来存储最大的成员,所有共用体的长度就是其最大成员的长度。


共用体可以使用在一个结构体当中,比如一个商品,它有些商品的ID使用的是整数,有些为字符串,可以如下处理
struct product
{
    char item_name[128];
    int type;
    union id
    {
long id_num;
char id_char[20];
    } id_val;
};


product p;
if(p.type = 1)
    cin>>p.id_val.id_num;
else
    cin>>p.id_val.id_char;


匿名共用体,它是没有名称的,其成员将成为位于相同地址处的变量,每次只有一个成员是当前的成员
比如:
struct product
{
    char item_name[128];
    int type;
    union id
    {
long id_num;
char id_char[20];
    };
};


product p;
if(p.type = 1)
    cin>>p.id_num;
else
    cin>>p.id_char;


共用体常常是用来节省内存,常用于操作系统数据结构或硬件数据结构。


枚举


C++中的enum工具提供了另外一种创建符号常的方式,这种方式可以代替const,它还可以定义新的类型,但是必须按严格的限制进行


enum语法:
enum spectrum{red,orange,yellow,green,blue,violet,indigo,ultraviolet};
上面的这个语句完成了两项工作:
1.把spectrum设置成为新类的名称,它被称为枚举
2.red,orange,yellow等成为了符号常量,它们对应的整数值是0~7,这些常量枚举量


默认情况下把整数赋值给枚举量,第一个枚举量是0,第二个是1,后面的依次递增,当然也可以显示的指整数值来覆盖默认值


在定义枚举名后可以使用这个枚举名来声明变量
spectrum sp;


在不进行强制转换的情况下,只可以把定义枚举时使用的枚举量赋值给枚举变量
sp = blue;
band = 100; 这个是有问题的,根本就没有定义这样的枚举量
注意:枚举是没有定义算术运算的只定了赋值运算
在赋值的时候可以进行强制转换进行赋值
比如
sp = spectrum(3);


枚举在定义的时候可以设置枚举量的值
比如:enum bits{one=1,tow=2,four =4,eight = 8};
注意这里只能设置整数,在设置的时候可以只对部分显示地进行设置值
比如:enum bigstep{first,second = 100,third};
这个时候first为0,second为100,后面的third为前一个枚举量加1即为101


对于枚举在定义的时候其中设置枚举量的值的时候多个枚举量的值可以设置为相同的整数值


枚举的取值范围


对于枚举来说,只有声明中指出的那些值是有效的。
C++可以通过强制类型转换,增加可赋给枚举变量的合法值。
每个枚举都有取值范围,可以通过强制类型转换把取值范围中的任何整数值赋给枚举变量,就算这个值不是枚举值
比如:enum bits{one=1,tow=2,four =4,eight = 8};
bits myflag;
下面这个代码是可行的
myflag = bits(5);
这里可以看到5不是一个枚举值,但是它是位于枚举定义的取值范围内的
那么这个取值范围是怎么定义的呢?
1.它先要找出上限是多少,先要知道枚举量的最大值,找到大于这个最大值的最小2的幂,再把它减去1
2.找它的下限,如果它不小于0,则下限是0,如果小于0则把最小值取绝对值 再按找最大值的方法一样找到最小值的值最后加上负号


C++中用多少空间来存储枚举是由编译器来决定的。对于取值范围较不的用一个字节或更小的空间,对于包含long类型的枚举则使用4个字节。

猜你喜欢

转载自blog.csdn.net/advent86/article/details/74512406