共用体
–关键字-- union
–是一种数据格式,能够存储不同的数据类型,但同时只能存储其中一种;且共用体的长度为最大成员的长度;
//共用体声明:
union one3all {
int int_val;
long long_val;
double double_val;
};
//共用体使用:
one3all pail;
pain.int_val = 15;
pain.double_val = 2.33 //(此时int值就会丢失,意思是int_val的值可能会改变);
—union可以为其成员指定public、protected和private等访问权限,默认情况下,其成员的访问权限为public
union one3all {
public :
int int_val;
long long_val;
private:
double double_val;
};
one3all b;//b访问不到私有成员;
//匿名union
int main(){
union{
public :
int int_val;
long long_val;
double double_val;
};
int_val = 20;
long_val = 2000;
//输出: int_val = 2000; long_val = 2000; 共用内存
}
//匿名的union成员可以像普通局部变量那样被引用,事实上对于程序而言,这也正是使用这些变量的方式.另外,尽管被定义在一个联合声明中,他们与同一个程序块的任何其他局部变量具有相同的作用域级别.这意味这匿名联合内的成员的名称不能与同一个作用域内的其他变量标识符冲突.
//因为匿名联合不使用点运算符,所以包含在匿名联合内的元素必须是数据,不允许有成员函数,也不能包含私有或受保护的成员。还有,全局匿名联合必须是静态(static)的,否则就必须放在匿名名字空间中。
union 里面那些东西不能存放?
—union 里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。
相比于struct: union是共用内存,union的大小是成员中最大的那个; struct是分别存储,struct的大小是所有成员的大小之和(还存在内存对齐);
#include <iostream>
using namespace std;
union Test{
struct{
int x;
int y;
int z;
}s;
int k;
}myUnion;
int main()
{
myUnion.s.x = 4;
myUnion.s.y = 5;
myUnion.s.z = 6;
myUnion.k = 0;
cout<< myUnion.s.x <<endl;
cout<< myUnion.s.y <<endl;
cout<< myUnion.s.z <<endl;
cout<< myUnion.k <<endl;
}
//输出:x=0; y=5; z=6; k=0;因为k所在内存和x相同
枚举
枚举声明:
enum spectrum {red, orange, yellow,...};
------将spectrum成为新类型的名称,被称为枚举(enumeration),将red,yellow等作为符号常量,对应0,1,2,…。称为枚举量。枚举量默认从0开始,当然也可以显示设置枚举量的值
enum spectrum {red=1, blue, orange=3, yellow=8};
若其中存在没有初始化的,则为前一个值加1;
只要使用时在范围内即合法,如:
spectrum mm;
mm = spectrum(2);
mm = red;
// -- 取值范围为大于最大值的最小2的幂减1;
//枚举使用
spectrum band;
band = yellow;
spectrum a;
a = blue;
switch(a)
{
case red:
cout<<"red"<<endl;
break;
case blue:
cout<<"blue"<<endl;
break;
default:
break;
}
----- 只能将枚举量赋值给该枚举的变量;
band = spectrum(3)
—相当于强制类型转换;
作用域内枚举----更推荐
对枚举类型而言,同一作用域内定义两个枚举,则不能重名,为了避免这一问题,新增一种枚举,使用class和struct定义: 就可避免重名
enum class new1 {never,often};
new1 n = new1::never;
std::cout<<(int)new1::never<<std::endl;
枚举的使用:
enum {One=1,Two=2,Three=3};
int item[Three];//有时候在类或者其他地方,想用变量创建一个数组时,可以这样使用;