自定义数据类型 一、结构体类型 1、???C++允许用户自己定义一组包含若干个类型不同(或相同)的数据项的数据类型,称为结构体。 2、???声明符号:struct 3、???一般形式:struct 结构体类型名{成员表列}; 4、???结构体类型名用来作结构体类型的标志。 5、???结构体中的每个成员也称为结构体中的一个域。成员表列又称为域表。 6、???声明结构体类型的位置一般在文件的开头,在所有函数之前。 7、???C++提供了类类型,所以在一般情况下,不必使用带函数的结构体。 二、结构体类型变量的定义方法及其初始化 1、???定义结构体类型变量的方法: a) 先声明结构体类型再定义变量名 结构体类型名?????结构体变量名 ?Student??????????? student1; C语言中结构体类型名前面加上关键字struct C++中可以省略 Student1中具有Student中同样的属性 b) 在声明类型的同时定义变量 一般形式: struct 结构体名 { ?????成员表列 ??? }变量名表列; c)? 直接定义结构体类型变量 一般形式: struct?????????? //没有结构体类型名 ?{ ???? 成员表列 ? }变量名表列;???? ??????????????? 这种方式虽然合法,但很少使用。提倡先定义类型后定义变量的第一种方法. ? 说明: 1、???不是所有的结构体类型都有相同的结构。 2、???类型与变量是不同的概念,只能对结构体变量中的成员赋值,不能对结构体类型赋值。在编译时,不会对类型分配空间,只为变量分配空间。 3、???结构体中的成员可以单独使用,它的作用与地位相当于普通变量。 4、???成员也可以是一个结构体变量。 5、??#include<iostream> 6、??usingnamespace?std; 7、? ? 8、??struct?Date???//声明一个结构体类型Date 9、??{ 10、???int?month; 11、???int?day; 12、???int?year; 13、?}; 14、?struct?Student??//声明一个结构体类型Student 15、?{ 16、???int?num; 17、???char?name[20]; 18、???char?sex; 19、???int?age; 20、???Datebirthday;??//Date是结构体类型,birthday是Date类型的成员 21、???char?addr[30]; 22、?}student1={},student2;//定义student1和student2为结构体类型Student的变量 首先声明了一个Date类型,具有三个成员month,day,year。然后声明Student类型,将成员birthday指定为Date类型,即birthday作为Date结构体类型名的结构体变量,具有month,day,year三个属性。 5、结构体中的成员名可以与程序中的变量名相同,但二者没有关系,互不影响。 ? 三、结构体变量的引用 1、可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。 ??? Student1=Student2; 2、???可以引用一个结构体变量中的一个成员的值。 Student1.num=1000; 3、???如果成员本身也是一个结构体类型,则要用若干个成员运算符,一级一级找到最低一级的成员。 例如;student1.birthday.month(引用结构体student1中的birthday中的month成员) 4、???不能将一个结构体变量作为一个整体进行输入和输出。 不能:cout<<student1;只能对各个成员分别输入和输出; 5、???对结构体变量的成员可以像普通变量一样进行各种运算。 例如:student2.score=student1.score; sum=student1.score+student2.score; student1.age++; ++student1.age 6、???可以引用结构体变量成员的地址,也可以引用结构体变量的地址。 例如;cout<<&student1;? //输出student1的首地址 cout<<&student1.age;//输出student1.age的地址 结构体变量的地址主要用作函数参数,将结构体变量的地址传递给形参。 ? 三、结构体数组 1、???结构体数组和其他数值型数组的不同之处在于:每个数组元素都是一个结构体类型的数组,他们都分别包含各个成员项。 2、???结构体数组就是用数组的形式保存复制多个结构体变量,不用在定义结构体后声明无数的变量实体。 3、???关于初始化:在声明结构体数组的时候可以对其进行初始化,数据类型必须对应,和普通数组初始化的模式一样,不确定数组长度的时候可以不写数组长度直接声明初始化。 四、结构体数组应用 对候选人得票的统计程序。设有三个候选人,最终只有一个人当选为领导。今有十个人参加投票,从键盘先后输入这十个人所投的候选人名字,要求最后输出这三个候选人的得票结果。 解析:这个题可以定义一个候选人结构体数组,包含3个元素,在每个元素中存放有关的数据。 实现程序如下: ? /* ?* newtest.cpp ?* ?*? Created on: 2012-4-8 ?*? ? ? Author:?David ?*/ ? #include?<iostream> /* ?* 声明结构体类型Person ?* 拥有name数组和count整型变量 ?* */ struct?Person? ? { char?name[20]; int?count; }; ? int?main() { //定义Person类型的数组,内容为三个候选人的姓名和当前的票数 Person leader[3]={"li",0,"zhang",0,"fun",0}; int?i,j; char?leader_name[20];?//leader_name为投票人所选的人的姓名 for(i=0;i<10;i++) { cin>>leader_name; for(j=0;j<3;j++) { if(strcmp(leader_name,leader[j].name)==0) { //如果与一个候选人的姓名相同,就给他加一票 leader[j].count++; } } cout<<endl; for(i=0;i<3;i++) { cout<<leader[i].name<<";"<<leader[i].count<<endl; } return?0; } }