天天看点

八、自定义数据类型

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