C++大学基础教程
第7章其它自定义数据类型
北京邮电大学电信工程学院
计算机技术中心
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-2-
C++语言不仅有丰富的基本数
据类型,而且允许用户自己
定义数据类型。
第7章 C++其他自定义数据类型
7.1 枚举型数据类型
7.2 结构型数据类型
7.3 联合型数据类型
7.1 枚举类型
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-5-
7.1 枚举类型
枚举型数据类型(简称枚举类型)
用户可以自己定义一种数据类型,把这种
数据类型的变量的可能值一一列举出
来,然后就可以使用这种数据类型来定
义变量了。这种新的数据类型称为枚举
类型,声明形式为:
enum 新的数据类型名称 {变量值列表 };
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-6-
7.1 枚举类型
例如:
enum weekday {sun, mon, tue, wed,
thu, fri, sat};
新的数据类型枚举元素或枚举常量
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-7-
7.1 枚举类型
定义一个weekday类型的变量:
weekday day;
变量day的取值范围为类型定义时,
表里列举出来的七种标识符,把这
些标识符看作符号常量对待。例
如:
day = sat;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-8-
7.1 枚举类型
使用枚举类型时要注意:
在类型定义之后,对枚举元素按常量处理,不
能对它们赋值。
枚举元素具有默认值,它们依次为:0,1,
2,……。
也可以在类型声明时另行指定枚举元素的值。
枚举值可以进行关系运算。
整数值不能直接赋给枚举变量;如需要将整数
值赋给枚举变量,应进行强制类型转换
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-9-
7.1 枚举类型
枚举常量在机器内部仍然是用整型
数来存取
在定义变量时要给变量分配存储空
间,那么定义某个枚举类型的变量
时,分配几个字节的内存空间呢?
(前面我们看到,枚举元素的默认值都是整数,可以给枚举元素
指定值,也用整数,所以说,在计算机内部处理时,是把枚举类
型按整型(int)对待的。)
7.2 结构类型
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-11-
7.2 结构类型
结构型数据类型(简称结构类型)
把现实生活中意义密切相关的一组
数据组合成一个整体,即由各种数
据类型(可以是基本数据类型或已
声明的自定义数据类型)的数据组
成一个集合,称为结构类型。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-12-
7.2 结构类型
结构的声明形式如下:
struct 结构类型名
{ 数据类型说明符 1 成员名 1;
数据类型说明符 2 成员名 2;
┇
数据类型说明符 n 成员名 n;
};
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-13-
7.2 结构类型
例如:
struct student
{ long num; //学号
char name[20]; //姓名
int age; //年龄
float score; //成绩
};
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-14-
7.2 结构类型
定义student类型的变量:
student s1;
结构类型的变量所占的存储空间是
结构中所有成员所占空间的总和
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-15-
7.2 结构类型
给结构变量赋初值,可以在变量定义时
同时设置初始值:
student s2={20041118,”Li Li”,18,90};
给结构变量赋值,也可以单独给各个成
员赋值。例如:
s1.num=20041118;
s1.name=”Li Li”;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-16-
7.2 结构类型
属于同一结构类型的各个变量之间可以
相互赋值,这一点和数组不同,C++规
定,不能直接进行数组名的赋值,因为
数组名是一个常量,而结构类型的变量
可以赋值。
不同结构的变量不允许相互赋值,即使
这两个变量可能具有同样的成员。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-17-
结构类型与指针
定义变量时,我们可以定义指向int型的
指针变量,类似的,可以有指向新定义
的结构型数据类型的指针变量。
可以将结构变量的地址赋给结构指针,
使结构指针的指向确定。使用取地址“&”
操作,得到结构变量的地址,这个地址
就是结构的第一个成员的地址。
用结构指针访问结构成员时,用箭头操
作符代替原来的点操作符。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-18-
结构类型与数组
声明一个结构类型后,就可以用来
组成更复杂的数据类型。可以象定
义基本数据类型的数组一样定义结
构类型的数组,称为结构数组。
结构数组的每个元素都是该结构类
型的变量。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-19-
结构类型与函数
用结构变量作为函数参数,属于按
值传递,这时结构变量中所有成员
的值都将被一一复制到形参中。
用结构变量作为函数参数,也可以
按引用传递,这时仅仅把结构变量
的地址传递给形参,而不用把结构
变量的成员值一一复制。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-20-
结构类型与函数
一个函数的参数可以是某个结构类型,同样道
理,函数的返回值也可以是某个结构类型。
以结构变量作为函数的返回值,到主函数中需
要把结构值复制给主函数中的结构变量,当结
构成员很多时,同样存在执行效率低的问题。
因此,也可以用结构的引用(或指针)作为返
回值。但是要注意:不能返回一个局部结构变
量的引用或指针。
7.3 联合类型
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-22-
7.3 联合类型
有时需要使几个不同类型的变量共用同
一组内存单元,这时可以声明一个联合
型数据类型,语法形式为:
union 联合类型名
{ 数据类型说明符 1 成员名 1;
数据类型说明符 2 成员名 2;
┇
数据类型说明符 n 成员名 n;
};
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-23-
7.3 联合类型
例如:
union uarea
{char c-data;
short s-data;
long l-data;
}ux;
新定义的联合类型
三个成员,它们共用
内存空间
uarea类型的变量ux
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-24-
7.3 联合类型
使用联合型变量时注意:
同一段内存用来存放几种不同类型的成员,但在某一
时刻只能存放其中一种,而不是同时存放几种。
联合变量中起作用的成员是最后一次存放的成员,在
存入一个新的成员后原有的成员就失去作用。
联合变量的地址和它的各个成员的地址都是同一地
址。
不能对联合变量名赋值,也不能在定义时初始化。
不能用联合变量作为函数参数或返回值。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-25-
作业
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-26-