自定义数据类型
什么是自定义数据类型呢?大家记得像char、int、float等类型吗?这些都是C++内置的基本数据类型,这些数据类型是不能满足我们在编程中的要求的,需要自己定义一些数据类型使用。自定义数据类型有:枚举类型、结构类型、联合类型、数组类型和类等。
枚举类型
枚举类型的声明形式为:
enum 枚举类型名 { 变量值列表 }; //变量值列表里都是整型变量,另外不要忘记最后面的分号!
enum weekday { sun,mon,tue,wed,thu,fri,sat };
这里的枚举元素sun、mon…都没有指定值,它们就使用默认值,依次为0,1,2…。即sun就是0,mon就是1,…sat是6。也可以在声明枚举类型时指定枚举元素的值,比如
enum weekday { sun=7, mon=1, tue, wed, thu, fri, sat };
这里sun就是7,mon是1,后面的值在mon的基础上依次加1,即tue等于2,wed为3…sat是6。枚举元素按常量处理,不能对它们赋值除了声明的时候。
定义枚举类型后,该枚举类型的变量取值范围仅为声明中的参数。
结构体
有时候我们需要将一些不同类型的数据组合成一个整体,例如,一个学生的学号、姓名、年龄和成绩等,它们数据类型不同,但都属于一个人。这就要用到结构体了,结构体就是由不同数据类型也可以是相同数据类型的若干数据组成的结合体,声明形式为:
struct 结构体名
{
数据类型 成员名 1;
数据类型 成员名 2;
:
数据类型 成员名 n;
}; //这里最后那个分号也不要忘记
struct student //学生信息结构体
{
int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
float score; //成绩
char addr[30]; //住址
};
构体型变量的定义形式也类似int等类型:
结构体类型名 结构体变量名;
定义一个上面的那个结构体变量,student s;。可以像这样声明了结构体类型以后再定义结构体变量,也可以把它们放在一起。结构体变量占用内存的大小可以用sizeof(结构体类型名或变量名)计算。在定义结构体变量时可以直接赋初值。结构体成员的使用形式是:结构体变量名.成员名。
结构体数据类型可以同时使用里面定义的所有数据变量类型,而枚举类型只能用其中一个。
联合体
有的时候需要几个不同类型的变量共用一组内存单元,这时就需要用联合体,联合体类型声明的语法形式为:
union 联合名
{
数据类型 成员名 1;
数据类型 成员名 2;
:
数据类型 成员名 n;
};
联合体类型变量声明的语法形式是:
联合体类型名 联合体变量名;
联合体类型变量的引用形式是:
联合体变量名.成员名
union uarea
{
char c_data;
short s_data;
long l_data;
}
联合体类型在内存中是怎样占用内存单元的呢?联合体占用的内存大小是其占内存最大的成员需要的内存大小,就像上边的uarea,它占用的内存大小就是最大成员long需要的4个字节。联合体里同时只能放一个成员的值。uarea放c_data时c_data占用第一个字节,放s_data时s_data占用前两个字节,放l_data时l_data占用全部的4个字节。
联合体也可以没有名称,叫做无名联合体。无名联合体只是声明一个成员项的集合,这些成员有相同的内存地址,可以用成员项的名字直接访问。
联合体类似与结构体,但是由于内存存储单元是联合体中最长的一块,当将联合体中数据均赋值时将产生数据覆盖的情况出现。
类型定义语句–typedef
编程时除了可以使用基本数据类型名和自定义的数据类型名以外还可以给一个已经存在的数据类型起个别名,这样做有几个好处,可以给已有的类型起一个有意义的名字,我们一看就知道它表示什么,提高可读性;还可以给较长的类型名另起一个短名。使用的语法形式是:
typedef 已有类型名 新类型名表;
新类型名表中可以有多个标识符,它们之间用逗号分开,就是在一个typedef语句中可以为一个已有数据类型声明多个别名,比如,
typedef double length,width;
length a;
width b;