学校要统计学生情况,于是Tomato同学给出了一张自己的信息表:
从上表来看,我们需要两个字符串分别用来存储姓名,需要两个整型变量分别来存储学号和年龄,还需要一个浮点型变量来存储平均成绩。一个学生已经需要至少5个存储空间,更何况一个学校有几千个学生,那将需要几万个存储空间。如果有这么多的变量,显然是很难管理的。
我们把变量比作为箱子。在现实生活中,如果小箱子太多太杂乱了,我们会拿一个大收纳箱来,把小箱子一个个有序地放到收纳箱里面。这样一来,在我们视线里的箱子就变少了,整理起来也会比较方便。那么,我们能否把这么多凌乱的变量整理到一个变量当中呢?
C++中有一种数据类型称为结构(Structure)类型,它允许用户自己定义一种数据类型,并且把描述该类型的各种数据类型一一整合到其中。
如上表所示,每个学生的信息成为了一个整体。一个学生拥有学号、姓名、年龄、院系和平均成绩这五项属性,我们把这些属性称为这个结构类型的成员数据(Data Member)。每项属性的数据类型也在旁边做了说明。这样一来,杂乱的数据和每个学生一一对应了起来,方便了我们管理。
定义一种结构类型的语法格式为:
struct 结构类型名
{
数据类型 成员数据1;
数据类型 成员数据2;
……
数据类型 成员数据n;
};
和定义枚举类型类似,定义结构类型的位置必须在首次使用该类型名之前,否则程序将无法正确识别该类型。要注意,定义完结构类型后的分号是必不可少的,否则将会引起错误。如果我们要创建前面的学生类型,可以写作:
struct student
{
int idNumber;
char name[15];
int age;
char department[20];
float gpa;
};
这时候,就有了一个新的数据类型,称为student。我们要用这种student类型来创建一个变量,并可以依次对它的成员数据进行初始化:
student s1={428004, "Tomato",20, "ComputerScience",84.5};
这样就有了一个student类型的变量s1。s1有五项属性,它们应该怎么表达呢?如果用自然语言描述,我们会说s1的idNumber、s1的name等等。在C++中,我们用一个点“.”来表示“的”,这个“.”称为成员操作符。
下面我们就来看一段程序,了解结构类型的基本使用:(程序9.2)
#include "iostream.h"
struct student
{
int idNumber;
char name[15];
int age;
char department[20];
float gpa;
};
int main()
{
student s1,s2;//首次使用student类型名,定义必须在这之前。
cout <<"输入学号:";
cin >>s1.idNumber;//成员数据可以被写入
cout <<"输入姓名:";
cin >>s1.name;
cout <<"输入年龄:";
cin >>s1.age;
cout <<"输入院系:";
cin >>s1.department;
cout <<"输入成绩:";
cin >>s1.gpa;
cout <<"学生s1信息:" <<endl <<"学号:" <<s1.idNumber <<"姓名:" <<s1.name <<"年龄:" <<s1.age <<endl <<"院系:" <<s1.department <<"成绩:" <<s1.gpa <<endl;//成员数据也能够被读出
s2=s1;//把s1的给各个成员数据值分别复制到s2中
cout <<"学生s2信息:" <<endl <<"学号:" <<s2.idNumber <<"姓名:" <<s2.name <<"年龄:" <<s2.age <<endl <<"院系:" <<s2.department <<"成绩:" <<s2.gpa <<endl;
return 0;
}
运行结果:
输入学号:428004
输入姓名:Tomato
输入年龄:20
输入院系:ComputerScience
输入成绩:84.5
学生s1信息:
学号:428004姓名:Tomato年龄:20
院系:ComputerScience成绩:84.5
学生s2信息:
学号:428004姓名:Tomato年龄:20
院系:ComputerScience成绩:84.5
我们看到,结构的成员数据是既可以被读出,也可以被写入的。而且,相同类型的结构变量还能够用一个赋值操作符“=”把一个变量的内容赋值给另一个变量。