说明:未加说明,struct均指C++语言中的struct(可以有成员函数,可以定义访问属性)
1 什么是Union?
(1)与class,struct相似用于定义数据结构;union 可以说是一种特殊的类,有自己的成员变量也可以有自己的成员函数,默认访问属性为public;
(2)共享同一内存;同一Union中的各个变量共享同一内存,也就是说,所有变量互斥存在。
(3)基于(2),Union那么有人可能问,一个Union结构占用的内存大小如何确定?不多说上代码:
1 // TemplateExe1.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 using namespace std; 7 union uEx { 8 int a; 9 char b; 10 double c; 11 12 }; 13 int main() 14 { 15 cout << sizeof(uEx) << endl; 16 17 return 0; 18 }
执行上述代码,不管你是否对uEx进行了初始化,sizeof(uEx)的大小始终为8(sizeof(double),32位IDE)。
由此可得,联合(共用体变量)共用同一内存,内存大小固定为成员变量所占内存的最大值。
2 为何使用Union?
重要原因:节省内存。
代码:
1 // TemplateExe1.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 using namespace std; 7 union uEx { 8 int a; 9 char b; 10 double c; 11 12 }; 13 class cEx 14 { 15 int a; 16 char b; 17 double c; 18 }; 19 int main() 20 { 21 cout << sizeof(uEx) << endl; 22 cout << sizeof(cEx) << endl; 23 getchar(); 24 return 0; 25 }
以上代码运行结果是:
8
16。
3 如何用?
(1)同结构体一样,定义-初始化-使用;使用时注意共享内存即可。上代码:
1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 union Grade { 5 int number; 6 char mark; 7 bool pass; 8 9 }uGrade; 10 int main() 11 { 12 uGrade.number = 90; 13 printf("%d",uGrade.number); 14 getchar(); 15 16 return 0; 17 }
代码中定义了一个全局Union 类,三个变量表示分数的三种形式。
应用场景归纳如下:
1)一门课程需要一个Grade数据结构来表示成绩;
2)同时成绩有三种情况,并且一门课程的成绩只有一种表示(要么百分制,要么等级制,要么过与不过)。
这时即可使用Union;