1、第5章 类与对象,5.1 结构,5.2 类与对象,5.3 构造函数和析构函数,5.4 静态成员,5.5 友员,小结,类(Class)是面向对象程序设计(OOP)实现信息封装的基础。类是用户定义类型,也称为类类型每个类包含数据说明和一组操作数据或传递消息的函数。类的 实例称为对象C+的类由C语言的结构类型演变而来。,第5章 类与对象,结构是用户自定义的数据类型 结构由数目固定的成员构成各成员可以具有不同的数据类型一个结构变量在内存占有一片连续的存储空间,5.1 结构,结构类型定义形式为:struct 标识符 类型 成员1 ;类型 成员2 ;类型 成员n ; ;,5.1.1 定义结构和访问结构,1
2、定义结构,例: struct employee char name 10 ;long code ;float salary ;char address 50 ;char phone 20 ; ;,5.1.1 定义结构和访问结构,1定义结构,例: struct employee char name 10 ;long code ;float salary ;char address 50 ;char phone 20 ; ;,可以用不同方法定义一个结构变量,(1) 声明类型之后声明变量,employee worker1, worker2, *Emp ;,5.1.1 定义结构和访问结构,1定义结构,
3、例: struct employee char name 10 ;long code ;float salary ;char address 50 ;char phone 20 ; ;,可以用不同方法定义一个结构变量,(1) 声明类型之后声明变量,worker1, worker2, *Emp ;,(2) 声明类型的同时声明变量,5.1.1 定义结构和访问结构,1定义结构,例: struct employee char name 10 ;long code ;float salary ;char address 50 ;char phone 20 ; ;,可以用不同方法定义一个结构变量,(1)
4、声明类型之后声明变量,worker1, worker2, *Emp ;,(2) 声明类型的同时声明变量,(3) 直接声明结构类型变量,注意 此时没有了结构类型标识符,5.1.1 定义结构和访问结构,1定义结构,例: struct employee char name 10 ;long code ;float salary ;char address 50 ;char phone 20 ; ;,employee worker1, worker2, *Emp = ,说明,(1) 结构变量占有一片连续内存空间,具有结构类型的特征,5.1.1 定义结构和访问结构,1定义结构,说明,(2) 一个结构类型
5、的成员可以是另一个已定义的结构类型,struct date int month ;int day ;int year ; ; struct employee char name 10 ;date birthday ;long code ;float salary ;char address 50 ;char phone 11 ; worker1, worker2 ;,例如: 为职工结构添加出生日期信息类型和变量声明为:,person son ;,5.1.1 定义结构和访问结构,1定义结构,说明,(2) 一个结构类型的成员可以是另一个已定义的结构类型,struct person char nam
6、e 10 ;long code ;float salary ;char address 50 ;char phone 11 ; worker1, worker2 ;,错误 不能实现的无穷递归结构,5.1.1 定义结构和访问结构,1定义结构,说明,(3) 声明结构类型变量可以同时初始化,struct employee char name 10 ;long code ;float salary ;char address 50 ;char phone 11 ; worker = “Wang Li “ , 991083456, 1200.5, “guang zhou “ , “ 87111111 “
7、 ;,2访问结构,(1)访问结构变量的成员 结构变量 . 成员,点运算符,# include struct weather / 声明结构类型 double temp; double wind; ; void main ( ) weather today ; / 声明结构类型变量today . temp = 10.5 ; / 对结构变量成员赋值today . wind = 3.1 ;cout “Temp = ” today . temp endl ; / 按成员输出cout “Wind = ” today . wind endl ; ,访问结构变量成员,5.1.1 定义结构和访问结构,结构变量的
8、成员在结构变量定义后才有存储意义,2访问结构,(2)用指针访问结构变量的成员 结构指针 - 成员(*结构指针 ) . 成员,# include # include struct person char name20 ; unsigned long id; float salary; ; void main ( ) person pr1 ;person * pp ; / 定义结构指针pp = ,person * pp ;,pp = ,pp - name,pp - id,pp - salary,5.1.1 定义结构和访问结构,2访问结构,(2)用指针访问结构变量的成员 结构指针 - 成员(*结构指
9、针 ) . 成员,# include # include struct person char name20 ; unsigned long id; float salary; ; void main ( ) person pr1 ;person * pp ; / 定义结构指针pp = ,(*pp).name,(*pp). id,(*pp). salary,5.1.1 定义结构和访问结构,2访问结构,# include struct weather double temp; double wind; yesterday ; void main ( ) weather today ; yeste
10、rday . temp = 10.5 ; yesterday . wind = 3.1 ;today = yesterday ; / 结构变量整体赋值cout “Temp = ” today . temp endl ;cout “Wind = ” today . wind endl ; ,(3)类型相同的结构变量可以整体赋值,5.1.1 定义结构和访问结构,2访问结构,(3)类型相同的结构变量可以整体赋值,例如: struct weather1 double temp; double wind; yesterday ;struct weather2 double temp; double wi
11、nd; today ;,“类型相同的变量” 是指用同一类型标识符说明的变量,yesterday 和 today 尽管成员相同,但不是同类型变量 不可以整体赋值,5.1.1 定义结构和访问结构,# include # include struct person / 结构定义 char name10 ; unsigned int id; float salary ; ; person allone6 ; / 结构数组声明 void main ( ) int i ; person temp ; / 结构变量声明for ( i = 0 ; i allonei.id ;cout allonei.sala
12、ry ;cout allonej+1.salary ) / 结构变量的整体交换 temp = allonej ; allonej = allonej+1 ; allonej+1 = temp ; for ( i = 0 ; i 6 ; i + ) / 输出排序后数据cout allonei.name t allonei.id t allonei.salary endl ; ,例5-1 对结构数组以某一成员作关键字排序,5.1.1 定义结构和访问结构,# include # include struct person / 结构定义 char name10 ; unsigned int id; f
13、loat salary ; ; person allone6 ; / 结构数组声明 void main ( ) int i ; person temp ; / 结构变量声明for ( i = 0 ; i allonei.id ;cout allonei.salary ;cout allonej+1.salary ) / 结构变量的整体交换 temp = allonej ; allonej = allonej+1 ; allonej+1 = temp ; for ( i = 0 ; i 6 ; i + ) / 输出排序后数据cout allonei.name t allonei.id t all
14、onei.salary endl ; ,例5-1 对结构数组以某一成员作关键字排序,struct person / 结构定义 char name10 ; unsigned int id; float salary ; ; person allone6 ; / 结构数组声明,5.1.1 定义结构和访问结构,# include # include struct person / 结构定义 char name10 ; unsigned int id; float salary ; ; person allone6 ; / 结构数组声明 void main ( ) int i ; person tem
15、p ; / 结构变量声明for ( i = 0 ; i allonei.id ;cout allonei.salary ;cout allonej+1.salary ) / 结构变量的整体交换 temp = allonej ; allonej = allonej+1 ; allonej+1 = temp ; for ( i = 0 ; i 6 ; i + ) / 输出排序后数据cout allonei.name t allonei.id t allonei.salary endl ; ,例5-1 对结构数组以某一成员作关键字排序,void main ( ) int i ; person tem
16、p ; / 结构变量声明for ( i = 0 ; i allonei.id ;cout allonei.salary ;cout endl ; ;,接受空格输入,5.1.1 定义结构和访问结构,# include # include struct person / 结构定义 char name10 ; unsigned int id; float salary ; ; person allone6 ; / 结构数组声明 void main ( ) int i ; person temp ; / 结构变量声明for ( i = 0 ; i allonei.id ;cout allonei.sa
17、lary ;cout allonej+1.salary ) / 结构变量的整体交换 temp = allonej ; allonej = allonej+1 ; allonej+1 = temp ; for ( i = 0 ; i 6 ; i + ) / 输出排序后数据cout allonei.name t allonei.id t allonei.salary endl ; ,例5-1 对结构数组以某一成员作关键字排序,cout allonej+1.salary ) / 结构变量的整体交换 temp = allonej ; allonej = allonej+1 ; allonej+1 =
18、temp ; ,冒泡排序,5.1.1 定义结构和访问结构,# include # include struct person / 结构定义 char name10 ; unsigned int id; float salary ; ; person allone6 ; / 结构数组声明 void main ( ) int i ; person temp ; / 结构变量声明for ( i = 0 ; i allonei.id ;cout allonei.salary ;cout allonej+1.salary ) / 结构变量的整体交换 temp = allonej ; allonej =
19、allonej+1 ; allonej+1 = temp ; for ( i = 0 ; i 6 ; i + ) / 输出排序后数据cout allonei.name t allonei.id t allonei.salary endl ; ,例5-1 对结构数组以某一成员作关键字排序,for ( i = 0 ; i 6 ; i + ) / 输出排序后数据coutallonei.nametallonei.idtallonei.salaryendl ;,5.1.1 定义结构和访问结构,# include # include struct person / 结构定义 char name10 ; u
20、nsigned int id; float salary ; ; person allone6 ; / 结构数组声明 void main ( ) int i ; person temp ; / 结构变量声明for ( i = 0 ; i allonei.id ;cout allonei.salary ;cout allonej+1.salary ) / 结构变量的整体交换 temp = allonej ; allonej = allonej+1 ; allonej+1 = temp ; for ( i = 0 ; i 6 ; i + ) / 输出排序后数据cout allonei.name t
21、 allonei.id t allonei.salary endl ; ,例5-1 对结构数组以某一成员作关键字排序,5.1.1 定义结构和访问结构,课堂练习,定义一个学生信息结构,信息字段包括姓名、学号、性别 利用该学生信息结构编写程序,输入一个班级的学生信息,输入完成后再次输出该班级学生信息。(假设班级的学生人数为20人),问题: 结构变量的整体交换降低了排序效率 解决: 使用索引机制, 建立结构指针数组,讨论,方法 :1. 建立索引数组2. 以关键字作依据进行数据比较,移动索引3. 通过索引访问数据,5.1.1 定义结构和访问结构,使用索引排序,1. 建立索引数组,2. 排序(冒泡法),
22、5.1.1 定义结构和访问结构,使用索引排序,1. 建立索引数组,2. 排序(冒泡法),pa 0 &allone0 1 &allone1 2 &allone2 3 &allone3 4 &allone4 5 &allone5,5.1.1 定义结构和访问结构,使用索引排序,1. 建立索引数组,2. 排序(冒泡法),pa 0 &allone0 1 &allone1 2 &allone2 3 &allone3 4 &allone4 5 &allone5,pa 0 salary pa 1 salary 即 allone0 . salary allone1 . salary 不交换,5.1.1 定义结构
23、和访问结构,使用索引排序,1. 建立索引数组,2. 排序(冒泡法),pa 0 &allone0 1 &allone1 2 &allone2 3 &allone3 4 &allone4 5 &allone5,5.1.1 定义结构和访问结构,使用索引排序,1. 建立索引数组,2. 排序(冒泡法),pa 1 salary pa 2 salary 即 allone1 . salary allone2 . salary,pa 0 &allone0 1 &allone1 2 &allone2 3 &allone3 4 &allone4 5 &allone5,5.1.1 定义结构和访问结构,使用索引排序,1
24、. 建立索引数组,2. 排序(冒泡法),pa 1 salary pa 2 salary 即 allone1 . salary allone2 . salary,pa 0 &allone0 1 2 3 &allone3 4 &allone4 5 &allone5,&allone2,&allone1,5.1.1 定义结构和访问结构,使用索引排序,1. 建立索引数组,2. 排序(冒泡法),pa 0 &allone0 1 &allone2 2 &allone1 3 &allone3 4 &allone4 5 &allone5,5.1.1 定义结构和访问结构,使用索引排序,pa 2 salary pa
25、3 salary 即 allone1 .salary allone3 . salary 不交换,pa 0 &allone0 1 &allone2 2 &allone1 3 &allone3 4 &allone4 5 &allone5,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 0 &allone0 1 &allone2 2 &allone1 3 &allone3 4 &allone4 5 &allone5,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 3 salary pa 4 salary 即
26、allone3 . salary allone4 .salary,pa 0 &allone0 1 &allone2 2 &allone1 3 &allone3 4 &allone4 5 &allone5,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 3 salary pa 4 salary 即 allone3 . salary allone4 .salary,pa 0 &allone0 1 &allone2 2 &allone1 3 4 5 &allone5,&allone4,&allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,
27、2. 排序(冒泡法),使用索引排序,pa 0 &allone0 1 &allone2 2 &allone1 3 &allone4 4 &allone3 5 &allone5,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 4 salary pa 5 salary 即 allone3 . salary allone5 . salary,pa 0 &allone0 1 &allone2 2 &allone1 3 &allone4 4 &allone3 5 &allone5,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索
28、引排序,pa 4 salary pa 5 salary 即 allone3 . salary allone5 . salary,pa 0 &allone0 1 &allone2 2 &allone1 3 &allone4 4 5 ,&allone5,&allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 0 &allone0 1 &allone2 2 &allone1 3 &allone4 4 &allone5 5 &allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 0 sala
29、ry pa 1 salary 即 allone0 . salary allone2 .salary,pa 0 &allone0 1 &allone2 2 &allone1 3 &allone4 4 &allone5 5 &allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 0 salary pa 1 salary 即 allone0 . salary allone2 .salary,pa 0 1 2 &allone1 3 &allone4 4 &allone5 5 &allone3,&allone2,&allone0,5.1.1 定义结
30、构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 0 &allone2 1 &allone0 2 &allone1 3 &allone4 4 &allone5 5 &allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 1 salary pa 2 salary 即 allone0 .salary allone1 .salary 不交换,pa 0 &allone2 1 &allone0 2 &allone1 3 &allone4 4 &allone5 5 &allone3,5.1.1 定义结构和访问结构,1. 建立
31、索引数组,2. 排序(冒泡法),使用索引排序,pa 0 &allone2 1 &allone0 2 &allone1 3 &allone4 4 &allone5 5 &allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 2 salary pa 3 salary 即 allone1 . salary allone4 . salary,pa 0 &allone2 1 &allone0 2 &allone1 3 &allone4 4 &allone5 5 &allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法
32、),使用索引排序,pa 2 salary pa 3 salary 即 allone1 . salary allone4 . salary,pa 0 &allone2 1 &allone0 2 3 4 &allone5 5 &allone3,&allone4,&allone1,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 0 &allone2 1 &allone0 2 &allone4 3 &allone1 4 &allone5 5 &allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,pa 3
33、salary pa 4 salary 即 allone1 . salary allone5 . salary 不交换,pa 0 &allone2 1 &allone0 2 &allone4 3 &allone1 4 &allone5 5 &allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,排序结果:,pa 0 &allone2 1 &allone0 2 &allone4 3 &allone1 4 &allone5 5 &allone3,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),使用索引排序,排序结果:,pa
34、0 &allone2 1 &allone0 2 &allone4 3 &allone1 4 &allone5 5 &allone3,3. 输出,for ( k = 0; knameidsalary; ,5.1.1 定义结构和访问结构,1. 建立索引数组,2. 排序(冒泡法),:person * pa6 = ,5.1.1 定义结构和访问结构,使用索引排序,若索引数组说明为:int pa 6 = 0, 1, 2, 3, 4 , 5 ;,想一想,程序该如何修改? 请你试一试,5.1.1 定义结构和访问结构,程序对数据的表示,不但要求存放基本信息,还要表示与其它数据元素的关系线性表是最简单的数据组织形
35、式,5.1.2 链表,5.1.2 链表,5.1.2 链表,5.1.2 链表,1动态链表存储,结点,5.1.2 链表,5.1.2 链表,1动态链表存储,数据元素信息,5.1.2 链表,5.1.2 链表,1动态链表存储,元素关系,5.1.2 链表,5.1.2 链表,1动态链表存储,结点数据类型 struct node char name20 ; float salary ; node * next ; ;,单向链表结点数据类型 struct node dataType data ; node * next ; ;,2建立和遍历链表,建立链表的过程:生成头结点;while(未结束) 生成新结点;把新
36、结点插入链表;,struct node int data ; node * next ; ; node * head ; node * CreateList() node * s, * p ; s = new node ;cin s-data ;head = NULL ;while ( s-data != 0 ) if ( head = NULL ) head = s ;else p-next = s ;p = s ;s = new node ;cin s-data ;p - next = NULL ;delete s ;return ( head ) ; ,5.1.2 链表,2建立和遍历链表
37、,建立链表的过程:生成头结点;while(未结束) 生成新结点;把新结点插入链表;,struct node int data ; node * next ; ; node * head ; node * CreateList() node * s, * p ; s = new node ;cin s-data ;head = NULL ;while ( s-data != 0 ) if ( head = NULL ) head = s ;else p-next = s ;p = s ;s = new node ;cin s-data ;p - next = NULL ;delete s ;re
38、turn ( head ) ; ,结构类型,5.1.2 链表,2建立和遍历链表,建立链表的过程:生成头结点;while(未结束) 生成新结点;把新结点插入链表;,struct node int data ; node * next ; ; node * head ; node * CreateList() node * s, * p ; s = new node ;cin s-data ;head = NULL ;while ( s-data != 0 ) if ( head = NULL ) head = s ;else p-next = s ;p = s ;s = new node ;ci
39、n s-data ;p - next = NULL ;delete s ;return ( head ) ; ,头指针,5.1.2 链表,2建立和遍历链表,建立链表的过程:生成头结点;while(未结束) 生成新结点;把新结点插入链表;,struct node int data ; node * next ; ; node * head ; node * CreateList() node * s, * p ; s = new node ;cin s-data ;head = NULL ;while ( s-data != 0 ) if ( head = NULL ) head = s ;el
40、se p-next = s ;p = s ;s = new node ;cin s-data ;p - next = NULL ;delete s ;return ( head ) ; ,建立链表函数 返回头指针,5.1.2 链表,2建立和遍历链表,建立链表的过程:生成头结点;while(未结束) 生成新结点;把新结点插入链表;,struct node int data ; node * next ; ; node * head ; node * CreateList() node * s, * p ; s = new node ;cin s-data ;head = NULL ;while
41、( s-data != 0 ) if ( head = NULL ) head = s ;else p-next = s ;p = s ;s = new node ;cin s-data ;p - next = NULL ;delete s ;return ( head ) ; ,声明局部量,5.1.2 链表,2建立和遍历链表,建立链表的过程:生成头结点;while(未结束) 生成新结点;把新结点插入链表;,struct node int data ; node * next ; ; node * head ; node * CreateList() node * s, * p ; s = n
42、ew node ;cin s-data ;head = NULL ;while ( s-data != 0 ) if ( head = NULL ) head = s ;else p-next = s ;p = s ;s = new node ;cin s-data ;p - next = NULL ;delete s ;return ( head ) ; ,建立第一个结点,5.1.2 链表,2建立和遍历链表,建立链表的过程:生成头结点;while(未结束) 生成新结点;把新结点插入链表;,struct node int data ; node * next ; ; node * head ; node * CreateList() node * s, * p ; s = new node ;cin s-data ;head = NULL ;while ( s-data != 0 ) if ( head = NULL ) head = s ;else p-next = s ;p = s ;s = new node ;cin s-data ;p - next = NULL ;delete s ;return ( head ) ; ,