结构体(struct)、联合体(union)、枚举(enum) 三种结构的区别及各个结构细节的总结
2015-02-28 14:30
309 查看
今天上网无意中看到了union结构, 好久不用了, 回想了一下结构体(struct)、联合体(union)、枚举(enum)各自的特点及用法,并在网上查了些资料,总结在这里,以备以后查看.
C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别:
原文地址:http://www.cnblogs.com/LubinLew/p/struct_enum_union_in_cpp.html?utm_source=tuicool
1、C++定义的结构名、联合名、枚举名 都是类型名,可以直接用于变量的声明或定义。即在C++中定义变量时不必在结构名、联合名、枚举名 前加上前缀struct、union、enum。
变量定义(header.h):
在C++中的使用方法:
在C中通常使用typedef关键字来达到和C++代码一样的的效果:
2、C中的结构体(struct)和联合体(union)只能定义成员变量,而C++中的结构体(struct) 和 联合体 中可以定义函数。
2.1 C++中struct 和 class 的区别
在C++中struct也是一种类,他与class具有相同的功能,用法完全相同。唯一的区别就是:在没有指定成员的访问权限时,struct中默认为public权限,class中默认为private权限。
2.2 C++中的 union 和 class 的区别
union支持 public , protected 以及 private 权限。读者看到这可能会问,要是这样的话,union与class还有什么区别吗?区别还是有的
1. union不支持继承
2. union中不能定义虚函数。
3.在没有指定成员的访问权限时,union中默认为public权限
4.union中的成员类型比class少,具体见2.2.1节
2.2.1C++中的 union 不能存放的成员类型
联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。不是所有类都能作为union的成员变量,如果一个类,包括其父类,含有自定义的constructor,copy
constructor,destructor,copy assignment operator(拷贝赋值运算符), virtual function中的任意一个,那么这种类型的变量不能作为union的成员变量,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。
2.2.2 C++中的 union 的匿名联合(屠龙之术 - 一辈子都可能不会用到)
如果我们在定义union的时候没有定义名字,那么这个union被称为匿名union(anonymous union)。匿名联合仅仅通知编译器它的成员变量共同享一个地址,并且变量本身是直接引用的,不使用通常的点号运算符语法.匿名union的特点如下:
1. 匿名union中不能定义static变量。
2. 匿名union中不能定义函数。
3. 匿名union中不支持 protected 以及 private 权限。
4. 在全局域以及namespace中定义的匿名union只能是static的,否则必须放在匿名名字空间中。
注:利用union可以判断系统中的CPU 是Little endian 还是Big endian 模式:
计算结构体(struct)、联合体(union)、枚举(enum)占用字节数:
结构体(struct):
结构体占用内存大小需要遵循以下的结构体对齐方式来计算:
1.整体空间是最大成员占用字节的整数倍,比如这里最大字节占用的是double,他为8,那肯定是8,16,24.
2.内存按照结构体中的数据成员先后排序,并且当前地址应该是以当前成员所占用空间的整数倍。比如在这里double b占用的是8个字节,那么以摆字节就应该是8,16,24.而char a,只有一个字节,则前面空间自动补齐。
联合体(union)
由于联合体中,每个变量都是从偏移地址零开始存储,每次只有一个成员存储于该地址,所以联合体(union)占用的内存大小为成员中最大类型所占用的内存大小.
枚举(enum)
enum相当于int类型,所以sizeof(enum结构名)时总是为4.如:
注:enum和union如果不定义变量,其实并没有分配空间。
示例如下:
C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别:
原文地址:http://www.cnblogs.com/LubinLew/p/struct_enum_union_in_cpp.html?utm_source=tuicool
1、C++定义的结构名、联合名、枚举名 都是类型名,可以直接用于变量的声明或定义。即在C++中定义变量时不必在结构名、联合名、枚举名 前加上前缀struct、union、enum。
变量定义(header.h):
<span style="font-size:14px;"><span style="font-size:12px;">enum color {red,blak,white,blue,yellow}; struct student {char name[6]; int age; int num;}; union score {int i_sc; float f_sc;};</span></span>在C中的使用方法:
<span style="font-size:14px;"><span style="font-size:12px;">#include "head.h" int main(void) { enum color en_col; struct student st_stu; union score un_sc; union score un_sc; //.... return 0; }</span></span>
在C++中的使用方法:
<span style="font-size:14px;"><span style="font-size:12px;">#include "head.h" int main(void) { color en_col; student st_stu; score un_sc; //.... return 0; }</span></span>
在C中通常使用typedef关键字来达到和C++代码一样的的效果:
<span style="font-size:14px;"><span style="font-size:12px;">typedef enum _color {red,blak,white,blue,yellow}color; typedef struct _student {char name[6]; int age; int num;}student; typedef union _score {int i_sc; float f_sc;} score; int main(void) { color en_col; student st_stu; score un_sc; //.... return 0; }</span></span>
2、C中的结构体(struct)和联合体(union)只能定义成员变量,而C++中的结构体(struct) 和 联合体 中可以定义函数。
<span style="font-size:14px;"><span style="font-size:12px;">#include <iostream> using namespace std; struct student { char name[6]; int age; char* GetName(void){return name;}; int GetAge(void){return age;}; }; union score { int i_sc; float f_sc; int GetInt(void){return i_sc;}; float GetFloat(void){return f_sc;}; }; int main(void) { student st_stu = {"Lubin", 27}; score un_sc = {100}; cout << st_stu.GetName() << endl; cout << st_stu.GetAge() << endl; cout << un_sc.GetInt() << endl; return 0; } /* 输出结果 Lubin 27 100 */</span></span>
2.1 C++中struct 和 class 的区别
在C++中struct也是一种类,他与class具有相同的功能,用法完全相同。唯一的区别就是:在没有指定成员的访问权限时,struct中默认为public权限,class中默认为private权限。
2.2 C++中的 union 和 class 的区别
union支持 public , protected 以及 private 权限。读者看到这可能会问,要是这样的话,union与class还有什么区别吗?区别还是有的
1. union不支持继承
2. union中不能定义虚函数。
3.在没有指定成员的访问权限时,union中默认为public权限
4.union中的成员类型比class少,具体见2.2.1节
2.2.1C++中的 union 不能存放的成员类型
联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。不是所有类都能作为union的成员变量,如果一个类,包括其父类,含有自定义的constructor,copy
constructor,destructor,copy assignment operator(拷贝赋值运算符), virtual function中的任意一个,那么这种类型的变量不能作为union的成员变量,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。
2.2.2 C++中的 union 的匿名联合(屠龙之术 - 一辈子都可能不会用到)
如果我们在定义union的时候没有定义名字,那么这个union被称为匿名union(anonymous union)。匿名联合仅仅通知编译器它的成员变量共同享一个地址,并且变量本身是直接引用的,不使用通常的点号运算符语法.匿名union的特点如下:
1. 匿名union中不能定义static变量。
2. 匿名union中不能定义函数。
3. 匿名union中不支持 protected 以及 private 权限。
4. 在全局域以及namespace中定义的匿名union只能是static的,否则必须放在匿名名字空间中。
注:利用union可以判断系统中的CPU 是Little endian 还是Big endian 模式:
<span style="font-size:14px;">int checkCPU() { union w { int a; char b; } c; c.a = 1; return (c.b == 1); }</span>
计算结构体(struct)、联合体(union)、枚举(enum)占用字节数:
结构体(struct):
结构体占用内存大小需要遵循以下的结构体对齐方式来计算:
1.整体空间是最大成员占用字节的整数倍,比如这里最大字节占用的是double,他为8,那肯定是8,16,24.
2.内存按照结构体中的数据成员先后排序,并且当前地址应该是以当前成员所占用空间的整数倍。比如在这里double b占用的是8个字节,那么以摆字节就应该是8,16,24.而char a,只有一个字节,则前面空间自动补齐。
联合体(union)
由于联合体中,每个变量都是从偏移地址零开始存储,每次只有一个成员存储于该地址,所以联合体(union)占用的内存大小为成员中最大类型所占用的内存大小.
枚举(enum)
enum相当于int类型,所以sizeof(enum结构名)时总是为4.如:
<span style="font-size:14px;"><span style="font-size:12px;">enum Test { TESTTYPE1 = 0, TESTTYPE2, TESTTYPE3, TESTTYPE4, TESTTYPE5, TESTTYPE6, TESTTYPE7, TESTTYPE8, TESTTYPE9 }; cout<<sizeof(Test)<<endl; //result /* 4 */</span>
注:enum和union如果不定义变量,其实并没有分配空间。
示例如下:
<span style="font-size:14px;"><span style="font-size:12px;">enum Test { TESTTYPE1 = 0, TESTTYPE2, TESTTYPE3, TESTTYPE4, TESTTYPE5, TESTTYPE6, TESTTYPE7, TESTTYPE8, TESTTYPE9 }; struct testStruct { char a; int b; double c; Test d; enum Test1 { TESTTYPE1 = 0, TESTTYPE2, TESTTYPE3, TESTTYPE4, TESTTYPE5, TESTTYPE6, TESTTYPE7, TESTTYPE8, TESTTYPE9 }; }; int main() { Test a; testStruct b; cout <<sizeof(Test)<< endl; cout <<sizeof(a) << endl; cout << sizeof(testStruct)<<endl; cout << sizeof(b)<<endl; system("PAUSE"); return 0; } //result /* 4 4 24 24 */</span>
相关文章推荐
- 结构体(Struct)联合体(Union)枚举(enum)总结
- 结构体struct、枚举enum、联合体union、位字段、自定义类型typedef、字节对齐
- 结构struct 联合Union和枚举Enum的细节讨论
- 结构struct 联合Union和枚举Enum的细节讨论
- 结构体struct和联合体union以及enum枚举体5的区别
- C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别
- 结构struct 联合Union和枚举Enum的细节讨论
- 联合体(union)和结构体(struct)的区别
- 联合体(union)和结构体(struct)的区别
- C语言中struct和union,结构体和联合体的区别
- C++学习总结(五)——结构体(struct),联合体(union)
- 结构体(struct)和联合体/共同体(union)的联系和区别——名企面试重难点
- struct和union结构体和联合体的区别
- C#中的结构体(Struct)和枚举(enum)的区别
- 联合体union和枚举enum的用法总结--基于C语法
- C++中的共用体(union)结构解析与结构体(struct)共用体(union) 的区别
- 结构体(struct)和联合体/共同体(union)的联系和区别——名企面试重难点
- struct和union结构体和联合体的区别
- 联合体(union)和结构体(struct)的区别
- 联合体union 与结构体struct