要点:
- 任意时刻只有一个值可以有值,给其中一个成员赋值后,其他成员自动变为未定义状态。
- union的对象的存储
- union不能含有引用类型的成员
- c++11中,含有构造函数和析构函数的类型可以作为其成员(复杂,这里不讨论)
- 可以为其成员指定为public、protected、private等保护标记,默认为public
- 可以有匿名union
练习题:
关于union的内存分配:
eg.1
#include<iostream>
using namespace std;
union foo{
int i;
char c;
double k;
};
int main()
{
foo x;
cout<<sizeof(x)<<endl; // 8
cout<<sizeof(x.i)<<endl; // 4
cout<<sizeof(x.c)<<endl; // 1
cout<<sizeof(x.k)<<endl; // 8
return 0;
}
eg.2
#include<iostream>
using namespace std;
union foo{
char s[10];
int i;
};
int main()
{
foo x;
cout<<sizeof(x)<<endl; // 12
cout<<sizeof(x.s)<<endl; // 10
cout<<sizeof(x.i)<<endl; // 4
// cout<<sizeof(x.k)<<endl;
return 0;
}
eg.3
#include<iostream>
using namespace std;
union foo{
char s[10];
double i;
};
int main()
{
foo x;
cout<<sizeof(x)<<endl; // 16
cout<<sizeof(x.s)<<endl; // 10
cout<<sizeof(x.i)<<endl; // 8
// cout<<sizeof(x.k)<<endl;
return 0;
}
小结:union其内存分配大小满足两个方面要求。1. 不低于最大成员长度。2. 是字节数最多变量类型的整数倍
union的使用
eg.4
#include<iostream>
using namespace std;
union foo{
int i;
char k;
float j;
};
int main()
{
foo x;
x.i = 97;
cout<<"x.i = "<<x.i<<endl; // 97
cout<<"x.k = "<<x.k<<endl; // a
cout<<"x.j = "<<x.j<<endl; // 1.35926e-043
return 0;
}
eg.5
#include<iostream>
using namespace std;
union foo{
int i;
char k;
float j;
};
int main()
{
foo x;
x.k = 'A';
cout<<"x.i = "<<x.i<<endl; // 65
cout<<"x.k = "<<x.k<<endl; // A
cout<<"x.j = "<<x.j<<endl; // 9/10844e-044
return 0;
}
eg.6
#include<iostream>
using namespace std;
union foo{
int i;
char k;
float j;
};
int main()
{
foo x;
x.j = 97;
cout<<"x.i = "<<x.i<<endl; // 1120010240
cout<<"x.k = "<<x.k<<endl; //
cout<<"x.j = "<<x.j<<endl; // 97
return 0;
}
小结:上述三个案例可以看出,union的内存是起始于同一开始位置的,并且仅限一个值可用,同时从第三个案例看出,int型和float的编码方式并不相同。(int,补码;float,阶码)