当内置基本数据类型不能满足需求时,就需要自定义数据类型。主要有:枚举类型、结构类型、联合类型、数组类型和类。
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; //这样定义提高了代码的可读性