当内置基本数据类型不能满足需求时,就需要自定义数据类型。主要有:枚举类型、结构类型、联合类型、数组类型和类。 1.枚举类型 有当遇到描述一件事情时只能取几个有限值的情况,比如,一周七天(我们可以用0到6整数表示周一至周日),比赛结果只有胜、负、平等。如果我们用整数来表示星期几那就需要判断是不是在0到6之间的合法值,但如果用枚举类型定义就没有这种问题,因为枚举类型就那几个可能的值。 枚举类型的声明形式为: enum 枚举类型名 { 变量值列表 }; //变量值列表里都是整型变量,结尾是分号 如: enum weekday {sun,mon,tue,wed,thu,fri,sat}; 上面没有指定具体数值,默认依次为0,1,2….6,即sun为零,依次对应。
同样,我们可以在声明enum类型时指定值、 enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};
上面tue等在mon的基础上依次递增。enum元素按常量处理,除了声明之外不能对它们赋值。如sun=0;这样是非法的。 可以定义枚举类型的变量。整数值需要赋给枚举变量时,应进行强制类型转换。
#include <iostream> using namespace std; enum game_result {WIN,LOSE,CANCEL}; int main() { game_result g; // 声明变量时,可以不写关键字enum enum game_result r=CANCEL; // 也可以在类型名前写上关键字enum int count; for(count=WIN;count<=CANCEL;++count) { g=(game_result)count; //整数赋给enum变量,强制转换 if(g==r) cout<<"CANCEL"<<endl; else if(g==WIN) cout<<"WIN"<<endl; else cout<<"LOSE"<<endl; } return 0; }
2.结构体
由相同或不同类型组合成的一个整体。
struct 结构体名 { 数据类型 成员名 1; 数据类型 成员名 2; : 数据类型 成员名 n; }; //结尾分号结构体变量占用内存的大小:sizeof(结构体类型名或变量名)
3.联合体
有的时候需要几个不同类型的变量共用一组内存单元,这时就需要用联合体,联合体类型声明的语法形式为:
union 联合名 { 数据类型 成员名 1; 数据类型 成员名 2; : 数据类型 成员名 n; };同样变量的引用形式为:联合体变量名.成员名
union exa { char c_data; short s_data; long l_data; };联合体占用内存的方式和上面不同,因为“共用一组内存单元”,也就是说它占用的大小为最大成员所占用的空间。如上面exa占用内存大小即为long所占用的空间大小。联合体同时只能放一个成员的值。当放c_data时占用第一个字节,同理只放s_data时占用前两个字节,只放l_data时占用全部字节。
联合体也可以没有名称,叫做无名联合体,只是声明一个成员项的集合,这些成员有相同的内存地址,可以用成员项的名字直接访问。如:
uninon { intI; folatf; }在程序总可以直接用成员项i和f的名字访问i和f,比如 i=2; f=3.2;。无名联合体一般是用作结构体的内嵌成员。
#include <iostream> using namespace std; union myun { int i; struct {int j;int k;int l;}s; }u; int main() { u.s.j=2; u.s.k=3; u.s.l=4; u.i=0; cout<<u.s.j<<" "<<u.s.k<<" "<<u.s.l<<endl; //输出结果为0,3,4,这是因为联合体共用内存,j的值被后面的i覆盖了 return 0; }
4.类型定义语句—typedef
给已有的类型起一个别名,提高可读性。
typedef 已有类型 新类型
如:
typedef int length; typedef double width; length a; width b; //这样定义提高了代码的可读性