2.2 构造数据类型
C++的构造类型主要有数组、枚举、结构体、联合体和类,关于类将在后面章节中详细介绍,本节简单介绍其他几种构造类型。
2.2.1 数组
有时需要在程序中表示许多类型相同的数据,如记录一个班级每名学生某门课程的成绩,假设这个班级有60名学生,在程序中定义60个不相关的实型变量是非常烦琐的,这时可以用数组来表示这60名学生某门课程的成绩。数组变量可以存放一组具有相同类型的数据,其语法格式如下:
数据类型 数组名[数组元素个数];
其中,数据类型既可以是简单数据类型,又可以是构造数据类型。上面提到60名学生某门课程的成绩可以表示为:
float score[60];
访问数组中的元素可以通过数组名加下标的方式,下标范围从0到数组元素个数减1,如用score[0]访问数组中第一个元素,即第一名学生的成绩;score[59]访问数组中最后一个元素,即第60名学生的成绩。下面的语句可以输出第10名学生的成绩。
cout <<score[9]<<endl;
字符数组是一种常用的数组,它是指数组中的每个元素都是字符,这样就可以用字符数组描述字符串变量,具体示例如下:
char str[9]="qianfeng";
上述语句中,str数组有9个存储空间,除了存储字符串中的8个字符外,还在最后一个存储单元中存储字符串结束标志'\0'。上述语句定义完字符数组后,用str[3]表示字符'n',用str表示整个字符串,下面的语句就可以直接输出str整个字符串,具体示例如下:
cout <<str <<endl;
当观众去电影院看电影时,通常电影票上写着几排几座,此时观众首先会根据排号找到座位所在的行,然后根据座号找到座位所在的列,类似这样的数据都可以用二维数组来描述,其语法格式如下:
数组类型 数组名[行数(常量表达式)][列数(常量表达式)];
假如需要记录60名学生3门课程的成绩,可以通过如下方式定义:
float score[60][3];
其中,行号范围为0~59,表示60名学生;列号范围为0~2,表示3门课程,这个数组总有180个元素,即对应180个成绩。数组元素在内存中是按顺序存放的,如score数组的存放方式如图2.7所示。
图2.7 score数组的存放方式
类似地,还可以定义多维数组,它的定义与二维数组类似,但由于多维数组不易于想象、难以调试且较占用内存,在实际开发中很少用到,因此不再赘述。
2.2.2 枚举
在生活中,表示男女性别时,有两种取值:Male、Female。程序中可以用整数来表示这种数据,具体示例如下:
int Gender;//Gender取值为0或1,0表示Male,1表示Female
这种表示有两个缺点:一是不直观,二是容易出错。如果Gender赋值为3,在编译时不会报错,但这显然有问题,此时Gender不再表示男女性别。在C++中,可以用枚举这个数据类型来解决这个问题。枚举的使用很像一个整数类型,其语法格式如下:
enum枚举类型名{常量1,常量2,…,常量n};
它表示定义一种枚举的数据类型,具有这种数据类型的变量所有可以取的值都列在后面的括号中。定义描述性别的枚举类型,具体示例如下:
enum Gender{M ale,Female};
接下来,可以通过枚举类型Gender定义变量,具体示例如下:
Gender gender;
这时,变量gender的取值就有两种,即Male、Female。如果希望变量gender表示Male,只需把Male赋值给gender,具体示例如下:
gender=Male;
枚举类型中的每个元素的值实际上都是整数,枚举类型本质上就是一个整数的集合,默认情况下,第一个枚举元素被赋值为0,接下来的枚举元素取值依次是前一个枚举元素的取值加1。根据实际情况,程序中也可以显式地指定某个枚举元素的值,具体示例如下:
enumW eek{Sun,Mon,Tue=3,Wed,Thu=3,Fri,Sat};
上述语句中,Sun值为0,Mon值为1,Tue值为3,Wed值为4,Thu值为3,Fri值为4,Sat值为5。从此示例中可以得出,同一枚举类型的不同常量取值不是唯一的。
在C++中,另一种使用枚举类型的方法是定义一个匿名enum枚举类型,即enum后不给出具体的类型名,将其中的枚举常量作为一般常量使用,具体示例如下:
上述语句中,枚举常量Min和Max可以作为一般的符号常量使用,事实上,匿名枚举的主要用途就是定义符号常量。
2.2.3 结构体
假设要存储有关学生的信息,则可能要存储学生的姓名、学号、年龄、成绩等。这时就希望有一种数据类型可以将这些信息存储在一个单元中,显然数组不能符合要求,但C++中的结构体可以符合要求。结构体是一种比数组更灵活的数据类型,因为同一个结构可以存储多种类型的数据,这样就可以将有关学生的信息放在一个结构体中,从而将数据的表示合并到一起。如果要表示整个班级学生,则可以使用结构体数组。结构体也是类的基石,学习结构体将使大家离面向对象程序设计的核心更近一步,其语法格式如下:
其中,struct是关键字,不可以省略;结构体名要符合标识符的命名规则,可以省略;成员类型除了可以是基本数据类型外,还可以是构造数据类型。具体示例如下:
定义了结构体类型后,在表示具体的一个学生时,就可以定义这个结构体类型的变量,具体示例如下:
Student stu;
当存储学生信息时,就可以为结构体中的各个成员分别赋值,具体示例如下:
strcpy(stu.name,"小千"); stu.id=2018010101; stu.age=18; stu.score=98.0f;
为使某个结构体变量有初始值,可以在定义这个变量时直接为它初始化,具体示例如下:
Student stu1={"小锋",2018010102,18,99.0f};
2.2.4 联合体
联合体是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。简单理解,结构体可以同时存储int、long和double,但联合体只能存储int、long和double中的一种类型,因此联合体常用于节省内存。定义和使用联合体的方法和结构体十分类似,也需要首先定义联合体内部的成员类型,其语法格式如下:
假设管理一个商品目录,其中有一些商品的编号为整数,而另一些商品的编号为字符串,这时就可以用联合体来表示,具体示例如下:
定义了联合类型后,在表示具体的一个商品编号时,就可以定义这个联合体类型的变量,具体示例如下:
上述代码中,当id.id_num赋值为65时,输出id.id_name为A。