C++语言不仅有丰富的系统预定义的基本数据类型,而且允许用户进行数据类型的自定义。自定义的数据类型有结构类型、联合类型、枚举类型、数组类型和类等。本文档将介绍结构体、联合体、枚举类型及typedef的应用。
1.结构体
在某些情况下,需要将一些不同类型的数据组合成一个有机的整体。结构体是由不同数据类型的数据组成的一个集合体。
结构体的声明格式如下:
struct 结构体名
{
数据类型1 成员名1;
数据类型2 成员名2;
...
数据类型n 成员名n;
};
结构体变量定义格式如下:
结构体名 结构体变量名;
结构体变量的使用形式如下:
结构体变量名.成员名
其实在结构体中也可以定义方法,结构体就是类的一个雏形。但是结构体不具备类的多态性、继承性等高级性质。
2.联合体
有时,在程序设计中需要将几个不同类型的变量共用同一段内存单元,这时可以定义一个联合体类型。这种几个不同变量共占用同一段内存的数据结构称为联合体类型(又成共用体)。
联合体的声明格式如下:
union 联合体名
{
数据类型1 成员名1;
数据类型2 成员名2;
...
数据类型n 成员名n;
};
联合体定义格式如下:
联合体名 联合体变量名;
联合体变量的使用形式如下:
联合体变量名.成员名
对于联合体还可以不声明名称,即声明为无名联合体。无名联合体没有名称,仅仅声明了一个成员项的集合,这些成员项具有相同的内存地址,可以由成员直接访问。例如:
union
{
int a;
char c;
double x;
};
在程序中可以直接使用成员,例如:
a = 18;
c = 'A';
x = 51.8;
【例1】联合体的应用
#include<iostream.h>
#include<iomanip.h>
struct example
{
char id[10];
char name[20];
char sex;
int age;
union
{
float salary;
float score;
};
}teacher,student;
void main()
{
example teacher = {"000788","WangWei",'M',30,5000};
example student = {"000518","ZhangYu",'F',20,95};
cout<<teacher.id<<<<teacher.name<<<<teacher.sex<<" "<<teacher.age<<" "<<teacher.salary<<endl;
cout<<student.id<<" "<<student.name<<" "<<student.sex<<" "<<student.age<<" "<<student.score<<endl;
cout<<"sizeofstudent="<<sizeof(student)<<endl;
cout<<"sizeofteacher="<<sizeof(teacher)<<endl;
}
程序运行结果:
000788 WangWei M 30 5000
000518 ZhangYu F 20 95
sizeofstudent=40
sizeofteacher=40
本例分析:该程序在结构体中声明了无名联合体,由于联合体变量在内存中共用同一段存储单元,因此sizeof求出的结构体变量的字节长度为40,而不是44。
3.枚举类型
所谓枚举是指变量只有有限种可能的取值情况,即变量的值可以一一列举。
枚举类型变量的声明格式如下:
enum 枚举类型名{变量列表}
其中,枚举类型名是程序员自定义的标识符,符合标识符命名规则即可,例如:
enum color{red,yellow,blue,white,black};
枚举元素具有默认值,按顺序依次为0、1、2、…枚举类型的元素按常量处理,不能赋初值,在C++系统中,枚举值可以进行关系运算,但整数值不能直接赋给枚举变量,需要进行强制类型转换。
4.typedef的应用
类型定义的使用格式如下:
typedef 已有类型名 新类型名表;
定义中的新类型名表可以有多个标识符,他们之间用逗号分隔。因此通过一个typedef语句可以为一个已有数据类型声明多个别名。例如:
typedef int natural,integer;
integer i,j;
natural n;
【例2】typedef的应用
#include<iostream.h>
typedef struct
{
int month;
int day;
int year;
}date;
void main()
{
date birthday = {12,18,2012};
cout<<"Your Birthday is:";
cout<<birthday.month<<"-"<<birthday.day<<"-"<<birthday.year<<endl;
}
程序运行结果:
Your Birthday is:12-18-2012
本例分析:该程序给结构体取了一个别名date(生日也是日期),该别名更符合结构体实际数据类型的具体意义,便于用户理解,提高了程序的可读性。
需要注意的是,typedef只能对已经存在的数据类型(包括预定义的基本数据类型和用户自定义的数据类型)增加一个或多个别名,而不能创造新的数据类型。
未完待续…