【C++】(十五)自定义数据类型——共用体类型、枚举类型
文章目录
- 自定义数据类型——共用体类型、枚举类型
- 1 共用体类型
- 2 枚举类型
- 3 typedef
自定义数据类型——共用体类型、枚举类型
1 共用体类型
共用体(union)是一种成员共享存储空间的结构体类型。共用体类型是抽象的数据类型,因此程序中需要事先声明具体的共用体类型,一般形式为:
union 共用体类型名 { 成员列表
};
共用体类型名与union
一起作为类型名称,成员列表是该类型数据 元素的集合。一对大括号{}
是成员列表边界符,后面必须用分号 (;
)结束。
union A {
int m,n; //整型成员
char a,b; //字符成员
};
共用体中每个成员与其他成员之间共享内存。 系统会计算共用体中最大的成员占用的空间并以之为共用体分配存储空间。
对于union A,m、n、a、b
共享内存单元,其内存结构如图所示。
结构体与共用体的内存形式是截然不同的。共用体内存长度是所有 成员内存长度的最大值,结构体内存长度是所有成员内存长度之和
。 可以用sizeof
取它们的内存长度进行比较。
与结构体对象相似,定义共用体对象也有三种形式:
- 先声明共用体类型再定义共用体对象
union 共用体类型名 共用体对象名列表;
- 同时声明共用体类型和定义共用体对象
union 共用体类型名 { 成员列表 } 共用体对象名列表
- 直接定义共用体对象
union { 成员列表 } 共用体对象名列表;
义共用体对象时可以进行初始化,但只能按一个成员
给予初值, 例如:
union A x={ 5678 }; //正确,只能给出1个初值
union A y={5,6,7,8}; //错误,试图给出4个初值(结构体做法)
共用体对象的使用主要是引用它的成员,方法是对象成员引用运算 (.
),例如:
x.m=5678; //给共用体成员赋值
cout<<x.m<<","<<x.n<<","<<x.a<<","<<x.b<<endl; //输出 5678,5678,46,46
cin>>x.m>>x.n>>x.a>>x.b;
x.n++; //共用体成员运算
第1句给成员m
赋值5678
,由于所有成员内存是共享的,因此每个成员都是这个值。
第2句输出m
和n
为5678
,输出a
和b
为46
,因为a
和b
类型为char
, 仅使用共享内存中的一部分(4个字节的低字节),即5678 (0x162E)
(注意是16进制0000,0000)的0x2E(46)
第三句每个成员的起始地址是相同的,当运行第3句时输入1 2 3 4↙
,x.m
得到1,但紧接着x.n
得到2时,x.m
也改变为2了(因为共 享),依次类推,最终x.b
得到4时,所有成员都是这个值。
第4句当x.n
自增运算后,所有成员的值都改变了。
由于成员是共享存储空间的,使用共用体对象成员时有如下特点:
- 修改一个成员会使其他成员发生改变,所有成员存储的总是最后 一次修改的结果;
- 所有成员的值是相同的,区别是不同的类型决定了使用这个值的全部或是部分;
- 所有成员的起始地址值是相同的,因此通常只按一个成员输入、 初始化;
2 枚举类型
枚举类型
是由用户自定义的由多个命名枚举常量构成的类型,其声 明形式为:
enum 枚举类型名 {命名枚举常量列表};
例如:
enum DAYS {MON,TUE,WED,THU,FRI,SAT,SUN};
DAYS
是枚举类型,MON
等是命名枚举常量。默认时枚举常量总是 从0开始,后续的枚举常量总是前一个的枚举常量加一。如MON
为 0,TUE
为1,……,SUN
为6。
(1)可以在(仅仅在)声明枚举类型时,为命名枚举常量指定值。 例如:
enum COLORS {RED=10,GREEN=8,BLUE,BLACK,WHITE};
则RED
为10、GREEN
为8、BLUE
为9、BLACK
为10、WHITE
为11。
(2)命名枚举常量是一个整型常量值,也称为枚举器,在枚举类 型范围内必须是唯一的。命名枚举常量是右值不是左值,例如:
RED=10; //错误,RED不是左值,不能被赋值
GREEN++; //错误,GREEN不是左值,不能自增自减
定义枚举类型对象有三种形式:
enum 枚举类型名 {命名枚举量列表} 枚举对象名列表;
enum 枚举类型名 枚举对象名列表; //在已有枚举类型下,最常用的定义形式
enum {命名枚举量列表} 枚举对象名列表; //使用较少的定义形式
可以在定义对象时进行初始化,其形式为:
枚举对象名1=初值1, 枚举对象名2=初值2,……;
enum DIRECTION {LEFT,UP,RIGHT,DOWN,BEFORE,BACK} dir=LEFT;
当给枚举类型对象赋值时,若是除枚举值之外的其他值,编译器会 给出错误信息,这样就能在编译阶段帮助程序员发现潜在的取值超出规定范围的错误。例如:
enum COLORS color;
color=101; //错误,不能类型转换
color=(COLORS)101; //正确,但结果没有定义
3 typedef
可以用typedef声明一个新类型名来代替已有类型名,其形式为:
typedef 已有类型名 新类型名;
其中已有类型名必须是已存在的数据类型的名称,新类型名是标识 符序列,习惯上用大写标识;如果是多个新类型名,用逗号(,
) 作为间隔。最后以分号(;
)结束。例如:
typedef unsigned char BYTE; //按计算机汇编指令习惯规定的字节型
typedef unsigned short WORD; //按计算机汇编指令习惯规定的字类型
typedef unsigned long DWORD; //按计算机汇编指令习惯规定的双字类型
C++程序设计-西北工业大学-魏英、姜学锋、刘君瑞
【C++】(十五)自定义数据类型——共用体类型、枚举类型相关推荐
- c++ new一个结构体_「C/C++」构造类型及应用:数组、结构体、共用体、枚举类型...
3.1数组 同类型.同性质.按顺序存放的一组数据集合,易于批量处理. 3.1.1一维数组 定义 int 1.数组名为常量,指向首地址,由系统指定. 2.数组长度为整型常量,但不能为0 3.上例取值im ...
- C语言程序设计(Part Ⅸ)——链表/共用体类型/枚举类型
C语言程序设计(Part Ⅸ)的整理笔记,若有错误,欢迎指正. 用指针处理链表 如果有一批数据要存储和引用,有两种方法: 一种方法是采取分配固定存储单元的方法,例如数组.但是在程序执行期间,数组的大小 ...
- JavaScript学习(八十五)—数据类型的转换
JavaScript学习(八十五)-数据类型的转换 一.什么是数据类型的转换? 简单来说,就是把一种数据类型的变量转化为另外一种数据类型 二.转化为字符串类型 //把数字转化为字符串 变量.toStr ...
- C#语言基础——结构体和枚举类型
结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...
- SV学习笔记—结构体及枚举类型及字符串
目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...
- Java--枚举类型(枚举类型介绍 定义枚举类型 枚举类型的使用 枚举类型的注意事项 遍历枚举项)
01: Java–枚举类型(枚举类型介绍 & 定义枚举类型 & 枚举类型的使用 & 枚举类型的注意事项 & 遍历枚举项) 02: Java–枚举类型(枚举类型实现接口 ...
- 字符串类型、结构体、共用体、枚举、container宏、内存来源
一.C语言的字符串类型 1.C语言没有原生字符串类型 很多高级语言像java.C#等就有字符串类型,有个String来表示字符串,用法和int这些很像,可以String s1 = "linu ...
- C 语言编程 — 高级数据类型 — 共用体
目录 文章目录 目录 前文列表 共用体 定义共用体 访问共用体成员 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本 ...
- 自定义数据类型——结构体
结构体的定义与使用 数组是一种数据形式,其特点是多个相同类型的元素集合起来 结构体是另一种重要的数据形式,特点是将不同类型的成员组合起来 数组和结构体形成了两种风格迥异的聚合方式,通过他们以及相互组合 ...
最新文章
- (最简单)小米MIX 2S的usb调试模式在哪里开启的流程
- 一文看懂如何搭建AI应用:10周学会深度学习,还赢下5千美元
- [转载]Qt之自定义界面(二)添加最小化、关闭按钮、添加背景
- console线驱动安装_低压灯带和高压灯带区别是啥 安装方法是啥?
- TensorFlow 资源大全中文版
- 产品原型设计5:移动App原型设计神器 - POP(Prototyping on Paper)
- 二分查找(binary_search)
- python处理出租车轨迹数据_基于出租车GPS轨迹数据的研究:出租车行程的数据分析...
- 河南对口升学计算机考纲,2018年河南省对口升学考纲.
- 【专题复习】极值点 拐点 驻点
- 原来证件照还可以这样拍?美炸了!再也不怕证件照丑到家了!
- HDFS 磁盘写及balance
- 怎么用html实现QQ代挂功能,如何给自己的代挂网、代刷网、底部添加腾讯云智服客服代码...
- Python学习笔记——数据分析之工作环境准备及数据分析建模理论基础
- 【Linux】gcc编译器下载与手动安装
- ssh海思3531a开发板的交叉编译
- 女朋友发的微信消息撤回了,python一串代码,让你大呼过瘾
- RuntimeError: CUDA error: no kernel image is available for execution on the device
- Windows找不到servicemsc文件怎么办?
- 转载《美团点评金融平台Web前端技术体系》