C++程序设计ppt课件

上传人:公**** 文档编号:569372464 上传时间:2024-07-29 格式:PPT 页数:359 大小:5.15MB
返回 下载 相关 举报
C++程序设计ppt课件_第1页
第1页 / 共359页
C++程序设计ppt课件_第2页
第2页 / 共359页
C++程序设计ppt课件_第3页
第3页 / 共359页
C++程序设计ppt课件_第4页
第4页 / 共359页
C++程序设计ppt课件_第5页
第5页 / 共359页
点击查看更多>>
资源描述

《C++程序设计ppt课件》由会员分享,可在线阅读,更多相关《C++程序设计ppt课件(359页珍藏版)》请在金锄头文库上搜索。

1、4737 C+程序设计程序设计1 1需要了解的需要了解的C语言知识语言知识C C语言基本语法语言基本语法If else If else 语句语句 ForFor语句语句WhileWhile语句语句数组定义数组定义函数定义函数定义指针指针结构体结构体运算符运算符2 2第一章认识第一章认识C+的对象的对象本节要点本节要点:C与与C+的关系的关系(领会领会)掌握函数原型和命名空间的使用方法掌握函数原型和命名空间的使用方法(综合应用综合应用)对象和预处理基本概念对象和预处理基本概念(领会领会)掌握掌握C+程序的基本结构程序的基本结构(综合应用综合应用)1.1初识初识C+的函数和对象的函数和对象3 3第一

2、章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象C语言回顾语言回顾int x;该语句在该语句在C语言和语言和C+中均可使用,中均可使用,x在在C语言中称为变量,在语言中称为变量,在C+中称为对象。中称为对象。C语言与语言与C+的不同点:的不同点:称呼不同称呼不同4 4第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象C语言回顾语言回顾结构体的定义结构体的定义struct pointstruct point float x float x; float yfloat y; ; 表示定义一种点数据表示定义一种点数据表示定义一种点数据表示定义一种

3、点数据类型,包含坐标类型,包含坐标类型,包含坐标类型,包含坐标x,y.x,y.x,y.x,y.定义完成后,定义完成后,定义完成后,定义完成后,pointpointpointpoint成成成成为一种类型为一种类型为一种类型为一种类型, , , ,使用方式使用方式使用方式使用方式类似类似类似类似intintintint类型类型类型类型如如如如: : : :定义定义定义定义p1p1p1p1变量为点类型变量为点类型变量为点类型变量为点类型, , , ,写作写作写作写作: : : :struct point p1; struct point p1; struct point p1; struct poi

4、nt p1; 或或或或point p1point p1point p1point p1;定义定义定义定义x x x x变量为整型变量为整型变量为整型变量为整型: : : :int x;int x;int x;int x;5 5第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象C语言回顾语言回顾结构体的定义结构体的定义struct studentstruct student int num; int num; char name10 char name10; float grade; float grade; ; 若定义一种结构体记若定义一种结构体记若定义一种结构体记

5、若定义一种结构体记录学生信息包含学号录学生信息包含学号录学生信息包含学号录学生信息包含学号, , , ,姓名姓名姓名姓名, , , ,成绩成绩成绩成绩, , , ,如何定义如何定义如何定义如何定义? ? ? ?定义定义定义定义s1s1s1s1变量为学生类型变量为学生类型变量为学生类型变量为学生类型, , , ,写作写作写作写作: : : :struct student s1;struct student s1;struct student s1;struct student s1;6 6第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象例例1.1输入一个点的信息,求

6、该点到原点的距离输入一个点的信息,求该点到原点的距离预处理命令,使用命名预处理命令,使用命名预处理命令,使用命名预处理命令,使用命名空间,声明函数,声明空间,声明函数,声明空间,声明函数,声明空间,声明函数,声明常量,定义结构体,常量,定义结构体,常量,定义结构体,常量,定义结构体,主函数主函数主函数主函数mainmainmainmain求距离函数求距离函数求距离函数求距离函数resultresultresultresult7 7例例1.18 8例例1.1主主函函数数9 9例例1.11010第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明

7、:1,混合型语言,混合型语言C语言程序包含语言程序包含main函数函数面向对象语言没有面向对象语言没有main函数函数C+是混合型语言是混合型语言1111第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:2,注释方式,注释方式/* 。*/。1212第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:3 3,输入输出流,输入输出流cincin和和coutcout是是C+C+语言中进行输入输出操作的函语言中进行输入输出操作的函数。其定义在数。其定义在isstreamisstream头文件中

8、。头文件中。类似:类似:C C语言中语言中printfprintf函数函数scanfscanf函数函数putcharputchar函函数数getchargetchar函数,使用时要包含函数,使用时要包含“stdio.hstdio.h”1313第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:3 3,输入输出流,输入输出流cincin和和coutcout函数的简单使用函数的简单使用coutcout后加要输出的内容,可以是对象或字符后加要输出的内容,可以是对象或字符串,行末加分号,可用多个串,行末加分号,可用多个来分隔多个输出来分隔多个输出对

9、象,对象,endlendl;表示输出后换行。;表示输出后换行。coutendl; coutendl; 等价于等价于 coutcoutcin后加存放数据的对象,即变量,行末加分后加存放数据的对象,即变量,行末加分号,可用多个号,可用多个来分隔多个输入对象。来分隔多个输入对象。cinxy;cinxy;等价于等价于 cinxcinx;cinyciny;1515第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:4 4,使用命名空间,使用命名空间是是C+C+语言中封装程序库名称的一种机制语言中封装程序库名称的一种机制记忆:记忆:C+C+标准类库中的

10、对象和函数都属于标准类库中的对象和函数都属于stdstd命名空间命名空间使用这些对象和函数时要使用这些对象和函数时要using namespace stdusing namespace std1616第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:4 4,使用命名空间,使用命名空间使用使用stdstd命名空间时注意:命名空间时注意:使用使用C C语言中的头文件时,要写成语言中的头文件时,要写成“xxx.hxxx.h”形式形式使用使用C+C+中的头文件则不能加上中的头文件则不能加上“.h.h”1717第一章认识第一章认识C+的对象的对象1

11、.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:5 5,对象定义及初始化,对象定义及初始化int xint x;x=0x=0;等价于;等价于 int x=0int x=0; C C语言语言int xint x(0 0);); C+C+语言等价于上两条语句。语言等价于上两条语句。此种初始化语法在此种初始化语法在C+C+中称为构造函数语法中称为构造函数语法1818第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:6 6,函数原型及其返回值,函数原型及其返回值函数要有类型,若要得到处理结果则要使用函数要有类型,若要得到处理结

12、果则要使用returnreturn语句。语句。1919第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:6 6,函数原型及其返回值,函数原型及其返回值函数原型声明函数原型声明函数调用在函数定义之前时要对函数进行声明函数调用在函数定义之前时要对函数进行声明20202121第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:7 7,constconst修饰符和预处理程序修饰符和预处理程序常量定义:常量定义:#define PI 3.1415 #define PI 3.1415 (c c语言

13、)语言)在变量定义之前加上在变量定义之前加上constconst关键字,表示定义关键字,表示定义的变量值不可改变。的变量值不可改变。const int PI=3.1415const int PI=3.1415;const int PIconst int PI(3.14153.1415););2222第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:7 7,constconst修饰符和预处理程序修饰符和预处理程序常量定义:常量定义:#define PI 3.1415#define PI 3.1415#define#define命令的特点:命

14、令的特点:原样替换掉程序中出现的预定义宏名符号原样替换掉程序中出现的预定义宏名符号如:如:#define BUFFER 100#define BUFFER 100若程序出现:若程序出现:x=BUFFER/3x=BUFFER/3;x=x=?尽量选择尽量选择constconst定义常量定义常量2323第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:7 7,constconst修饰符和预处理程序修饰符和预处理程序constconst关键字的特点:关键字的特点:利用利用constconst定义常量时必须给出常量的值,除非定义常量时必须给出常量的

15、值,除非该常量是该常量是externextern的。的。如:如:const int dconst int d; extern const extern const ;作业:作业:作业:作业:1 1 1 1,externexternexternextern变量是什么样的变量?变量是什么样的变量?变量是什么样的变量?变量是什么样的变量?2424第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:7 7,constconst修饰符和预处理程序修饰符和预处理程序C+C+预处理命令预处理命令以以# #开始,分为宏定义,文件包含和条件编译开始,分为宏定

16、义,文件包含和条件编译作业:作业:2 2,写出,写出C C语言中预处理命令有哪些,举例说明每个语言中预处理命令有哪些,举例说明每个命令含义及作用。命令含义及作用。3 3,写出,写出C C语言和语言和C+C+语言中语言中#include#include命令的不同处命令的不同处 2525第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:8 8,程序运行结果,程序运行结果2626第一章认识第一章认识C+的对象的对象1.1初识初识C+的函数和对象的函数和对象对程序的说明:对程序的说明:9 9,程序书写规则,程序书写规则注意缩进对齐,使程序清晰明了

17、注意缩进对齐,使程序清晰明了27271.2认识认识C+语言面向过程编程的特点语言面向过程编程的特点本节要点本节要点:函数重载函数重载(领会领会)掌握掌握C+的新数据类型的新数据类型(简单应用简单应用)动态分配内存动态分配内存(综合应用综合应用)熟练掌握引用的使用方法熟练掌握引用的使用方法(综合应用综合应用)了解对指针使用了解对指针使用const限定符的目的限定符的目的,方法方法(识记识记)了解泛型算法应用于普通数组的方法了解泛型算法应用于普通数组的方法(识记识记)掌握数据的简单输入输出掌握数据的简单输入输出(简单应用简单应用)2828第一章认识第一章认识C+的对象的对象1.2认识认识C+语言面

18、向过程编程的特点语言面向过程编程的特点本节要点本节要点:1.2.1函数重载函数重载(领会领会)C+允许一个函数定义多个版本。允许一个函数定义多个版本。使得一个函数完成多种功能。使得一个函数完成多种功能。即:同一个函数名定义多次。即:同一个函数名定义多次。29291.2.1函数重载函数重载(领会领会)重载函数重载函数max的调用形式:的调用形式:30301.2.1函数重载函数重载(领会领会)重载函数重载函数max的定义形式:的定义形式:31311.2.1函数重载函数重载(领会领会)重载函数重载函数max的声明形式:的声明形式: 可否不声明?可否不声明?重载函数的要点:重载函数的要点:函数名相同,

19、参数个数不同,参数类型不同函数名相同,参数个数不同,参数类型不同32321.2.2 C+的新数据类型的新数据类型(简单应用简单应用)1,void类型类型void表示无类型,或空类型。表示无类型,或空类型。不能声明变量,只能声明函数返回值。不能声明变量,只能声明函数返回值。表示函数无返回值。表示函数无返回值。33332,bool型型 (逻辑型,布尔型)(逻辑型,布尔型)占占1个字节。表示逻辑运算中的个字节。表示逻辑运算中的” 真真” ” 假假”3,整型(,整型(int long short)int 、short 至少至少16位位long 至少至少32位位short 不得比不得比int 长长int

20、 不得比不得比long 长长34344,char型型 (字符型)(字符型)占占1个字节。个字节。5,实型(,实型(float/double/long double)35355,&取地址符取地址符int x; &x表示?表示?什么样的变量可以存放什么样的变量可以存放&x?int *p; p是指针变量,指针变量能存放变量的地址。是指针变量,指针变量能存放变量的地址。P=&x;36366,常量表示,常量表示整型:整型:0前缀表示前缀表示8进制数,进制数,0x前缀表示前缀表示16进制进制加加L、l后缀表示长整型常量后缀表示长整型常量实型:实型:F、f后缀表示浮点型常量后缀表示浮点型常量(float)实

21、数加实数加L、l后缀表示后缀表示long double型型无前缀,无后缀的为无前缀,无后缀的为double型型37376,常量表示,常量表示0L0L123l123l05055 50x50x50xaf0xaf01017,转义字符,转义字符 101101 tt rr nn 00 x41x41 38381.2.3 动态分配内存动态分配内存(综合应用综合应用)new 动态分配内存动态分配内存一般格式:一般格式:指针变量指针变量=new 类型类型size;new 运算符得到新分配空间的首地址,赋值给运算符得到新分配空间的首地址,赋值给指针变量后,可根据指针变量的加减运算来使用指针变量后,可根据指针变量的

22、加减运算来使用这些空间。这些空间。delete 释放内存释放内存 使用完毕后要释放内存使用完毕后要释放内存delete p;pP+3P+139391.2.4 引用的使用方法引用的使用方法(综合应用综合应用)C+中新的表示形式。中新的表示形式。引用即使用变量的别名。引用即使用变量的别名。定义形式:数据类型定义形式:数据类型 & 别名别名=对象名;对象名;作用:别名与对象名对应同一个对象,共用同一作用:别名与对象名对应同一个对象,共用同一段内存。对别名的修改会造成原对象的修改。段内存。对别名的修改会造成原对象的修改。例如:例如:int x; int & a=x;表示表示a是变量是变量x的别名。的别

23、名。一旦定义别名后则一旦定义别名后则a和和x完全等价。完全等价。40401.2.4 引用的使用方法引用的使用方法(综合应用综合应用)C+中新的表示形式。中新的表示形式。引用即使用变量的别名。引用即使用变量的别名。定义形式:数据类型定义形式:数据类型 & 别名别名=对象名;对象名;作用:别名与对象名对应同一个对象,共用同一作用:别名与对象名对应同一个对象,共用同一段内存。对别名的修改会造成原对象的修改。段内存。对别名的修改会造成原对象的修改。例如:例如:int x; int & a=x;表示表示a是变量是变量x的别名。的别名。一旦定义别名后则一旦定义别名后则a和和x完全等价。完全等价。41411

24、.2.4 引用的使用方法引用的使用方法(综合应用综合应用)C+中新的表示形式。中新的表示形式。引用即使用变量的别名。引用即使用变量的别名。定义形式:数据类型定义形式:数据类型 & 别名别名=对象名;对象名;4242使用引用时注意:使用引用时注意:1,不能定义引用的引用,不能定义引用的引用 int & & r=x;2,不能直接定义数据组的引用,不能直接定义数据组的引用43431.2.4 引用的使用方法引用的使用方法(综合应用综合应用)一般格式:一般格式:typedef typedef 类型类型 类型别名类型别名使用使用typedeftypedef定义某类型别名后,可使用该别名定义某类型别名后,可

25、使用该别名来定义相关对象。来定义相关对象。例如:typedef long int lint;则 long int i ; 等价于 lint i ;用法总结:建立一个类型别名的方法很简单,用法总结:建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量在传统的变量声明表达式里用类型名替代变量名,然后把关键字名,然后把关键字typedeftypedef加在该语句的开头加在该语句的开头 4444引用数组名作参数引用数组名作参数一般格式:一般格式:typedef typedef 类型类型 类型别名类型别名使用使用typedeftypedef定义某类型别名后,可使用该别名定义某类型别名后

26、,可使用该别名来定义相关对象。来定义相关对象。例如:typedef long int lint;则 long int i ; 等价于 lint i ;4545Typedef使用说明使用说明typedeftypedef用法总结:建立一个类型别名的方法用法总结:建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字替代变量名,然后把关键字typedeftypedef加在该语加在该语句的开头句的开头 等价于等价于46461.2.5 对指针使用对指针使用const限定符限定符(识记识记)1,左值和右值,左值和右值表达式:表达式:E

27、1=E2E1是左值,是可被修改的是左值,是可被修改的int *p,x=1;*p=2; &p表示什么?表示什么? 47471.2.5 对指针使用对指针使用const限定符限定符(识记识记)2,指向常量的指针,指向常量的指针const常量定义,常量定义,表示表示const后的表达式不可改变,定义时必须后的表达式不可改变,定义时必须给出表达式的值。给出表达式的值。int x=11;const int *P;const int *P=&x;表示表示*P是不可改变的。是不可改变的。*P不能在不能在=左侧。左侧。P=&y; x=12;48481.2.5 对指针使用对指针使用const限定符限定符(识记识记

28、)3,常量指针,常量指针const常量定义,常量定义,表示表示const后的表达式不可改变,定义时必须后的表达式不可改变,定义时必须给出表达式的值。给出表达式的值。int x=11;int * const P ; 错!必须初始化错!必须初始化int * const P =&x ;表示表示P是不可改变的。是不可改变的。P不能在不能在=左侧。左侧。*p可改变。可改变。49491.2.5 对指针使用对指针使用const限定符限定符(识记识记)4,指向常量的常量指针,指向常量的常量指针const常量定义,常量定义,表示表示const后的表达式不可改变,定义时必须后的表达式不可改变,定义时必须给出表达式

29、的值。给出表达式的值。int x=11;const int * const P =&x ;表示表示P是不可改变的。是不可改变的。*p不可改变。不可改变。50501.2.6 泛型算法应用于普通数组泛型算法应用于普通数组(识记识记)掌握数据的简单输入输出掌握数据的简单输入输出(简单应用简单应用)泛型算法是泛型算法是C+标准模板库标准模板库(Standard Template Library)提供的一组操作。利用这些操作可以简化数组操提供的一组操作。利用这些操作可以简化数组操作。作。要使用这些操作必须包含头文件要使用这些操作必须包含头文件51511.2.6 泛型算法应用于普通数组泛型算法应用于普通数

30、组(识记识记)假定假定a,b是两个数组名,其长度为是两个数组名,其长度为len操作示例:操作示例:1,reverse(a,a+len)将数组将数组a中的元素顺序反转。(逆向)中的元素顺序反转。(逆向)2,copy(a,a+len,b)将将a数组的内容原样复制给数组的内容原样复制给b数组数组reverse_copy (a,a+len,b)将将a数组的内容反转后复制给数组的内容反转后复制给b数组数组52521.2.6 泛型算法应用于普通数组泛型算法应用于普通数组(识记识记)假定假定a,b是两个数组名,其长度为是两个数组名,其长度为len操作示例:操作示例:3,sort(a,a+len)将数组将数组

31、a中的元素按升序排序中的元素按升序排序4,sort(a,a+len,greater()将数组将数组a中的元素按降序排序中的元素按降序排序53531.2.6 泛型算法应用于普通数组泛型算法应用于普通数组(识记识记)假定假定a,b是两个数组名,其长度为是两个数组名,其长度为len操作示例:操作示例:5,find(a,a+len,value)在数组在数组a中查找值为中查找值为value的元素,并返回位置的元素,并返回位置指针指针54541.2.6 泛型算法应用于普通数组泛型算法应用于普通数组(识记识记)假定假定a,b是两个数组名,其长度为是两个数组名,其长度为len操作示例:操作示例:6,输出数组中

32、的内容,输出数组中的内容Copy(a,a+len, Ostream_iterator (cout,”字符串字符串”))Ostream_iterator表示输出流操作符表示输出流操作符:表示要输出的数组类型表示要输出的数组类型Cout表示流输出操作表示流输出操作“字符串字符串”:表示分隔字符串:表示分隔字符串5555第一章认识第一章认识C+的对象的对象1.2认识认识C+语言面向过程编程的特点语言面向过程编程的特点本节要点本节要点:1.2.7 数据的简单输入输出数据的简单输入输出(简单应用简单应用)5656第一章认识第一章认识C+的对象的对象1.3程序的编辑、编译、运行程序的编辑、编译、运行575

33、7第一章认识第一章认识C+的对象的对象课后题:课后题:课后题:课后题:P26 P26 三、改错题三、改错题三、改错题三、改错题 写作业本上写作业本上写作业本上写作业本上5858第二章从结构到类的演变第二章从结构到类的演变2.1结构的演化结构的演化.结构发生质的演变结构发生质的演变1. 函数与数据共存函数与数据共存C+允许结构中定义函数允许结构中定义函数,成为成员函数成为成员函数在结构中同时定义成员变量与成员函数在结构中同时定义成员变量与成员函数使用格式使用格式:结构对象结构对象.成员变量成员变量结构对象结构对象.成员函数成员函数5959第二章从结构到类的演变第二章从结构到类的演变1. 函数与数

34、据共存函数与数据共存结构的定义结构的定义struct pointstruct point double x,y; double x,y; void Setxy(double a, double b) void Setxy(double a, double b) x=a; y=b; x=a; y=b; void Display() void Display() cout xtyendl; cout xtyendl;6060第二章从结构到类的演变第二章从结构到类的演变1. 函数与数据共存函数与数据共存结构的定义结构的定义struct pointstruct point double x,y; do

35、uble x,y; void Setxy(double a, double b) void Setxy(double a, double b) x=a; y=b; x=a; y=b; void Display() void Display() cout xtyendl; cout xtyendl;数据成员数据成员成员函数成员函数6161第二章从结构到类的演变第二章从结构到类的演变1. 函数与数据共存函数与数据共存结构的定义结构的定义6262第二章从结构到类的演变第二章从结构到类的演变运行结果运行结果6363第二章从结构到类的演变第二章从结构到类的演变主函数主函数6464完整程序完整程序6565

36、修修修修改改改改后后后后的的的的程程程程序序序序6666第二章从结构到类的演变第二章从结构到类的演变2 封装封装若定义结构体时,使用了若定义结构体时,使用了private关键字,则产关键字,则产生封装性生封装性6767使使用用了了private关关键键字,字,则则产产生生封装性封装性6868第二章从结构到类的演变第二章从结构到类的演变2 封装封装在定义结构时,若使用了在定义结构时,若使用了private则产生封装则产生封装性,表示成员为私有的,只能在结构体内部通性,表示成员为私有的,只能在结构体内部通过公有成员函数使用。若未添加过公有成员函数使用。若未添加private则表则表示默认为示默认为

37、public。类定义时默认为类定义时默认为private。6969第二章从结构到类的演变第二章从结构到类的演变2.1.2 使用构造函数初始化结构的对象使用构造函数初始化结构的对象在定义结构时,与结构同名的函数称为构造函在定义结构时,与结构同名的函数称为构造函数。数。若定义的函数与某个已定义函数重名而参数类若定义的函数与某个已定义函数重名而参数类型或个数不同,则称为函数重载。型或个数不同,则称为函数重载。70702.1.2 使用构造函数初始化结构的对象使用构造函数初始化结构的对象问题:那个函数是构造函数?那个函数被重载了?问题:那个函数是构造函数?那个函数被重载了?结构体的定义结构体的定义717

38、12.1.2 使用构造函数初始化结构的对象使用构造函数初始化结构的对象注:构造函数在定义结构体对象时自动执行,注:构造函数在定义结构体对象时自动执行,并根据是否初始化来自动选择所调用的构造函数并根据是否初始化来自动选择所调用的构造函数72722.1.2 使用构造函数初始化结构的对象使用构造函数初始化结构的对象调用无参构造函数调用无参构造函数调用有参构造函数调用有参构造函数为为xy设置值设置值显示显示p1,p2的的xy值值73732.1.2 使用构造函数初始化结构的对象使用构造函数初始化结构的对象7474第二章从结构到类的演变第二章从结构到类的演变2.2从结构演化成一个简单的类从结构演化成一个简

39、单的类将程序中将程序中struct替换为替换为class即变为类的标准即变为类的标准定义形式定义形式7575第二章从结构到类的演变第二章从结构到类的演变2.2从结构演化成一个简单的类从结构演化成一个简单的类产生类对象产生类对象p1,p2为对象的属性赋值为对象的属性赋值显示对象属性值显示对象属性值7676第二章从结构到类的演变第二章从结构到类的演变2.2从结构演化成一个简单的类从结构演化成一个简单的类类图的表示类图的表示类名类名类属性类属性/成员变量成员变量类操作类操作/成员函数成员函数7777第二章从结构到类的演变第二章从结构到类的演变2.3面向过程和面向对象面向过程和面向对象简单了解对象的含

40、义简单了解对象的含义7878第二章从结构到类的演变第二章从结构到类的演变2.3面向过程和面向对象面向过程和面向对象简单了解对象的含义简单了解对象的含义7979第二章从结构到类的演变第二章从结构到类的演变2.3面向过程和面向对象面向过程和面向对象简单了解对象的含义简单了解对象的含义8080第二章从结构到类的演变第二章从结构到类的演变面向过程面向过程 的求解步骤的求解步骤给出三角形三个顶点坐标,计算三边长,并输出给出三角形三个顶点坐标,计算三边长,并输出步骤:输入步骤:输入x1,y1,x2,y2,x3,y3 六个数据六个数据 计算计算(x1,y1)和和(x2,y2)距离距离 计算计算(x1,y1)

41、和和(x3,y3)距离距离 计算计算(x2,y2)和和(x3,y3)距离距离 输出三个距离输出三个距离8181第二章从结构到类的演变第二章从结构到类的演变面向对象面向对象 的求解步骤的求解步骤给出三角形三个顶点坐标,计算三边长,并输出给出三角形三个顶点坐标,计算三边长,并输出设计类设计类将点设计为一个类,并提供将点设计为一个类,并提供相关的属性和操作相关的属性和操作8282第二章从结构到类的演变第二章从结构到类的演变面向对象面向对象 的求解步骤的求解步骤给出三角形三个顶点坐标,计算三边长,并输出给出三角形三个顶点坐标,计算三边长,并输出定义对象同时给出坐标定义对象同时给出坐标point A(x

42、1x1,y1y1)point B(x2x2,y2y2)point C(x3x3,y3y3)8383第二章从结构到类的演变第二章从结构到类的演变面向对象面向对象 的求解步骤的求解步骤给出三角形三个顶点坐标,计算三边长,并输出给出三角形三个顶点坐标,计算三边长,并输出定义对象,然后获取坐标定义对象,然后获取坐标point A;point B;point C ;A.Getx();A.Gety();B.Getx();B.Gety();C.Getx();C.Gety();8484第二章从结构到类的演变第二章从结构到类的演变面向对象面向对象 的求解步骤的求解步骤给出三角形三个顶点坐标,计算三边长,并输出给

43、出三角形三个顶点坐标,计算三边长,并输出计算距离并输出计算距离并输出AB=A.GetLength(B);AC=A.GetLength(C);BC=B.GetLength(C);8585第二章从结构到类的演变第二章从结构到类的演变2.4C+面向对象程序设计特点面向对象程序设计特点2.4.1 对象对象三要素:对象名,属性,操作三要素:对象名,属性,操作8686第二章从结构到类的演变第二章从结构到类的演变2.4C+面向对象程序设计特点面向对象程序设计特点2.4.1 对象对象三要素:对象名,属性,操作三要素:对象名,属性,操作8787第二章从结构到类的演变第二章从结构到类的演变2.5使用类和对象使用类

44、和对象2.5.1使用使用string对象对象类名类名类的属性用于存放字符串类的属性用于存放字符串类的操作类的操作/方法方法/成员函数成员函数8888第二章从结构到类的演变第二章从结构到类的演变2.5使用类和对象使用类和对象2.5.1使用使用string对象对象该类是该类是C+语言中的内语言中的内部预定义类,要在程序部预定义类,要在程序中使用该类时必须添加中使用该类时必须添加头文件头文件#inculude8989第二章从结构到类的演变第二章从结构到类的演变2.5使用类和对象使用类和对象2.5.1使用使用string对象对象类的初始化:类的初始化:string str1 =“A”; string

45、str1 =A; string str1 =AB; string str1 =“AB”;可以以数组的形式使用可以以数组的形式使用str1对象中的字符串对象中的字符串str10的值是?的值是?str11的值是?的值是?90902.5.1使用使用string对象对象类的初始化:类的初始化:string str1 (“hello,”); string str2 =“world”;可以以数组的形式使用可以以数组的形式使用str1对象中的字符串对象中的字符串str10的值是?的值是?str20的值是?的值是?91912.5.1使用使用string对象对象92922.5.1使用使用string对象对象运行

46、结果运行结果93932.5.1使用使用string对象对象string对象允许使用对象允许使用 + 运算运算94942.5.1使用使用string对象对象对象的方法对象的方法(操作操作/成员函数成员函数):对象名对象名.成员函数成员函数str1.size()String对象可使用对象可使用+运算运算Str1=str2+str3若若str2=“hello,” str3=“everyone”则则str1的结果是?的结果是?95952.5.2使用使用string对象的成员函数对象的成员函数成员函数使用格式:对象名成员函数使用格式:对象名.成员函数成员函数例如:例如:str1.size()若若Str1

47、=“everyone!”Str1.size()值为:值为:996962.5.2使用使用string对象的成员函数对象的成员函数成员函数使用格式:对象名成员函数使用格式:对象名.成员函数成员函数例如:例如:str1.substr()若若Str1=“everyone”Str1.substr(5,3)值为:值为:“one”C+中字符串中字符位置计数从中字符串中字符位置计数从0开始开始97972.5.2使用使用string对象的成员函数对象的成员函数成员函数使用格式:对象名成员函数使用格式:对象名.成员函数成员函数例如:例如:str1.substr()C+中字符串中字符位置计数从中字符串中字符位置计数

48、从0开始开始98982.5.2使用使用string对象的成员函数对象的成员函数成员函数使用格式:对象名成员函数使用格式:对象名.成员函数成员函数例如:例如:str1.find(要查找的字符串,开始位置要查找的字符串,开始位置)结果为子串的位置结果为子串的位置C+中字符串中字符位置计数从中字符串中字符位置计数从0开始开始99992.5.2使用使用string对象的成员函数对象的成员函数getline函数的使用函数的使用功能:利用功能:利用cin函数输入一行字符串存入对象函数输入一行字符串存入对象例如:例如:getline(cin,str1,n)1001002.5.2使用使用string对象的成员

49、函数对象的成员函数getline函数的使用函数的使用功能:利用功能:利用cin函数输入一行字符串存入对象函数输入一行字符串存入对象例如:例如:getline(cin,str1,n)101101简单应用:日期格式转换简单应用:日期格式转换1021022.5.3使用使用complex对象对象complex类用于定义一个复数对象类用于定义一个复数对象使用时添加头文件使用时添加头文件#include 定义格式:定义格式:complex num1(1,2);1031032.5.4使用对象小结使用对象小结使用标准类库中的类时,须添加头文件。使用标准类库中的类时,须添加头文件。使用使用string对象添加?

50、头文件?对象添加?头文件?添加头文件添加头文件#include 并使用标准命名空间并使用标准命名空间using namespace std;1041042.5.4使用对象小结使用对象小结使用标准类库中的类时,须添加头文件。使用标准类库中的类时,须添加头文件。定义对象方式同变量定义方式。定义对象方式同变量定义方式。定义对象时可对对象进行初始化。定义对象时可对对象进行初始化。int i;string str1;定义时初始化:定义时初始化:int i=1; 或或 int i(1););string str1=“hello”; 或或 string str1(“hello”);1051052.5.4使用

51、对象小结使用对象小结使用标准类库中的类时,须添加头文件。使用标准类库中的类时,须添加头文件。定义对象方式同变量定义方式。定义对象方式同变量定义方式。同类的不同对象由对象名和属性来区分。具有同类的不同对象由对象名和属性来区分。具有相同的成员函数。相同的成员函数。string str1=“hello”;string str2(“everyone”);Cout str1.size()endl;Cout str2.size()endl;1061062.5.4使用对象小结使用对象小结不同类对象具有不同的成员函数可实现不同操不同类对象具有不同的成员函数可实现不同操作。作。Complex num1(1,2)

52、;Complex num1(1,2);String str1(String str1(“hellohello”););Coutnum1.real()endl;Coutnum1.real()endl;Coutstr1.sizeendl;Coutstr1.sizeendl;Coutstr1endl; coutnum1endl;Coutstr1endl; coutnum1endl;1071072.5.4使用对象小结使用对象小结使用标准类库中的类时,须添加头文件。使用标准类库中的类时,须添加头文件。定义对象方式同变量定义方式。定义对象方式同变量定义方式。定义对象时可对对象进行初始化。定义对象时可对对象

53、进行初始化。同类的不同对象由对象属性来区分。同类的不同对象由对象属性来区分。不同类对象具有不同的成员函数可实现不同操作。不同类对象具有不同的成员函数可实现不同操作。类是具有相同特征和操作的对象的抽象。类是具有相同特征和操作的对象的抽象。1081082.6string对象数组与泛型算法对象数组与泛型算法109109第三章函数和函数模版第三章函数和函数模版3.1函数的参数及其传递方式函数的参数及其传递方式C语言中参数传递方式只有一种:值传递语言中参数传递方式只有一种:值传递值传递分为:变量值传递和变量地址值传递值传递分为:变量值传递和变量地址值传递C+中分为:值传递和地址传递(引用传递)中分为:值

54、传递和地址传递(引用传递)1101103.1函数的参数及其传递方式函数的参数及其传递方式12ba xy12 t12 xy1111113.1函数的参数及其传递方式函数的参数及其传递方式12ba2000200020022002 xy t20002000200220021121123.1函数的参数及其传递方式函数的参数及其传递方式要注意区分:要注意区分:参数传递中传地址和传地址值不同。参数传递中传地址和传地址值不同。设计函数时要注意:设计函数时要注意:对象作参数,对象指针作参数,对象引用作参数对象作参数,对象指针作参数,对象引用作参数1131133.1函数的参数及其传递方式函数的参数及其传递方式3.

55、1.1对象作函数参数对象作函数参数作用同作用同C语言中普通变量作参数语言中普通变量作参数1141143.1函数的参数及其传递方式函数的参数及其传递方式3.1.2对象指针作函数参数对象指针作函数参数作用同作用同C语言中变量指针作参数语言中变量指针作参数1151153.1函数的参数及其传递方式函数的参数及其传递方式3.1.3引用作为函数参数引用作为函数参数引用的声明形式:引用的声明形式:数据类型数据类型 &别名别名=对象名;对象名;int x=56;int &a=x;int &b=a;则则a为为x变量(对象)的引用,变量(对象)的引用,a和和x对应同一个对应同一个内存空间。内存空间。a未单独分配内

56、存。未单独分配内存。b为为a的引用。的引用。1161163.1函数的参数及其传递方式函数的参数及其传递方式3.1.3引用作为函数参数引用作为函数参数引用的声明形式:引用的声明形式:数据类型数据类型 &别名别名=对象名;对象名;int x=56;int &a=x;int &b=a; b=10;则则a为为x变量(对象)的引用,变量(对象)的引用,a和和x对应同一个对应同一个内存空间。内存空间。a未单独分配内存。未单独分配内存。b为为a的引用。的引用。程序中引用对象的改变会使得被引用对象发生改程序中引用对象的改变会使得被引用对象发生改变。变。1171173.1函数的参数及其传递方式函数的参数及其传递

57、方式3.1.3引用作为函数参数引用作为函数参数引用作函数参数:引用作函数参数:类型类型 函数名函数名(类型类型 &参数,参数,)函数调用时,实参对象名传递给形参对象名,形函数调用时,实参对象名传递给形参对象名,形参对象名成为实参的别名,函数中对形参的改变参对象名成为实参的别名,函数中对形参的改变就会导致实参值的改变。就会导致实参值的改变。1181183.1函数的参数及其传递方式函数的参数及其传递方式3.1.3引用作为函数参数引用作为函数参数引用作函数参数:引用作函数参数:类型类型 函数名函数名(类型类型 &参数,参数,)函数调用时,实参对象名传递给形参对象名,形函数调用时,实参对象名传递给形参

58、对象名,形参对象名成为实参的别名,函数中对形参的改变参对象名成为实参的别名,函数中对形参的改变就会导致实参值的改变。就会导致实参值的改变。1191193.1函数的参数及其传递方式函数的参数及其传递方式3.1.3引用作为函数参数引用作为函数参数引用作函数参数:引用作函数参数:类型类型 函数名函数名(类型类型 &参数,参数,)1201203.1函数的参数及其传递方式函数的参数及其传递方式3.1.3引用作为函数参数引用作为函数参数引用作函数参数引用作函数参数 说明:说明:1,引用对象不是一个独立对象,不占用内存。,引用对象不是一个独立对象,不占用内存。2,对象的指针作参数时,指针变量中存放实参,对象

59、的指针作参数时,指针变量中存放实参对象的地址。对象的地址。3,引用对象作参数时,函数调用时形参对象和,引用对象作参数时,函数调用时形参对象和实参对象共用一个内存单元。实参对象共用一个内存单元。121121引用数组名作参数引用数组名作参数122122引用数组名作参数引用数组名作参数一般格式:一般格式:typedef typedef 类型类型 类型别名类型别名使用使用typedeftypedef定义某类型别名后,可使用该别名定义某类型别名后,可使用该别名来定义相关对象。来定义相关对象。例如:typedef long int lint;则 long int i ; 等价于 lint i ;12312

60、3Typedef使用说明使用说明typedeftypedef用法总结:建立一个类型别名的方法用法总结:建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字替代变量名,然后把关键字typedeftypedef加在该语加在该语句的开头句的开头 等价于等价于1241243.1函数的参数及其传递方式函数的参数及其传递方式3.1.4默认参数默认参数函数调用时,可以为函数指定实参,也可不指定函数调用时,可以为函数指定实参,也可不指定实参,未指定实参时,函数自动取默认值。实参,未指定实参时,函数自动取默认值。1251253.1函数的参

61、数及其传递方式函数的参数及其传递方式3.1.4默认参数默认参数函数调用时,可以为函数指定实参,也可不指定函数调用时,可以为函数指定实参,也可不指定实参,未指定实参时,函数自动取默认值。实参,未指定实参时,函数自动取默认值。注意:注意:若函数第若函数第n个参数是默认参数,当调用函数需要个参数是默认参数,当调用函数需要指定该参数值时,则该参数前的所有参数都必须指定该参数值时,则该参数前的所有参数都必须指定。指定。1261263.1函数的参数及其传递方式函数的参数及其传递方式3.1.5使用使用const保护数据保护数据const限定参数值不可修改。限定参数值不可修改。1271273.2深入讨论函数的

62、返回值深入讨论函数的返回值1281283.2深入讨论函数的返回值深入讨论函数的返回值3.2.1返回引用的函数返回引用的函数1291293.2深入讨论函数的返回值深入讨论函数的返回值3.2.2返回指针的函数返回指针的函数定义数据个数定义数据个数定义指向数据的指针定义指向数据的指针利用利用input函数输入数据函数输入数据若指向数据的指针非空若指向数据的指针非空 则输出数据则输出数据1301303.2深入讨论函数的返回值深入讨论函数的返回值3.2.2返回指针的函数返回指针的函数输入数据个数存入输入数据个数存入n1311313.2深入讨论函数的返回值深入讨论函数的返回值3.2.3返回对象的函数返回对

63、象的函数1321323.2深入讨论函数的返回值深入讨论函数的返回值3.2.2返回指针的函数返回指针的函数补充补充说明:说明:new语句语句 delete语句语句 NULLNew格式:格式: 指针变量指针变量 = new 类型类型nDelete格式:格式: delete 指针变量指针变量NULL表示空表示空1331333.2深入讨论函数的返回值深入讨论函数的返回值1341343.2深入讨论函数的返回值深入讨论函数的返回值3.2.3返回对象的函数返回对象的函数1351353.2深入讨论函数的返回值深入讨论函数的返回值3.2.4返回值作为函数参数返回值作为函数参数1361363.3内联函数内联函数1

64、37137定义函数时,加定义函数时,加inline关键字表示该函数为内关键字表示该函数为内联函数。联函数。3.33.3内联函数内联函数138138定义函数时,加定义函数时,加inline关键字表示该函数为内关键字表示该函数为内联函数。联函数。程序中的内联函数在程序编译时,将函数体替程序中的内联函数在程序编译时,将函数体替换至程序中函数调用位置,造成程序变长,效换至程序中函数调用位置,造成程序变长,效率提高。率提高。注意:内联函数中不能出现循环、注意:内联函数中不能出现循环、switch语句语句 内联函数一般短小,不宜过长内联函数一般短小,不宜过长 应在调用之前声明或定义应在调用之前声明或定义3

65、.33.3内联函数内联函数1391393.4函数重载和默认参数函数重载和默认参数同一个函数名实现多种功能,在同一个函数名实现多种功能,在C+中称为多中称为多态,可利用函数重载和默认参数两种方式实现态,可利用函数重载和默认参数两种方式实现1401403.4函数重载和默认参数函数重载和默认参数同一个函数名实现多种功能,在同一个函数名实现多种功能,在C+中称为多中称为多态,可利用函数重载和默认参数两种方式实现态,可利用函数重载和默认参数两种方式实现定义或声明函定义或声明函数时,给出参数时,给出参数初始化值,数初始化值,则函数调用时则函数调用时若省略参数,若省略参数,则参数取该初则参数取该初始化值。称

66、为始化值。称为默认参数。默认参数。1411413.4函数重载和默认参数函数重载和默认参数同一个函数名实现多种功能,在同一个函数名实现多种功能,在C+中称为多中称为多态,可利用函数重载和默认参数两种方式实现态,可利用函数重载和默认参数两种方式实现注意:注意:函数重载和默认参数可同时使用。函数重载和默认参数可同时使用。若已定义默认参数函数,则不能重载参数类型若已定义默认参数函数,则不能重载参数类型相同,参数个数少于默认参数个数的函数。相同,参数个数少于默认参数个数的函数。1421423.4函数重载和默认参数函数重载和默认参数同一个函数名实现多种功能,在同一个函数名实现多种功能,在C+中称为多中称为

67、多态,可利用函数重载和默认参数两种方式实现态,可利用函数重载和默认参数两种方式实现注意:注意:函数重载和默认参数可同时使用。函数重载和默认参数可同时使用。若已定义默认参数函数,则不能重载参数类型若已定义默认参数函数,则不能重载参数类型相同,参数个数少于默认参数个数的函数。参相同,参数个数少于默认参数个数的函数。参数类型不同时,可以重载。数类型不同时,可以重载。1431433.5函数模板函数模板有些函数重载时参数个数相同,只是类有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利型不同,此时重载函数比较繁琐,可利用函数模板实现。用函数模板实现。1441443.5函数模板函数模板有

68、些函数重载时参数个数相同,只是类有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利型不同,此时重载函数比较繁琐,可利用函数模板实现。用函数模板实现。1451453.5函数模板函数模板有些函数重载时参数个数相同,只是类有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利型不同,此时重载函数比较繁琐,可利用函数模板实现。用函数模板实现。1461463.5函数模板函数模板函数模板定义格式:函数模板定义格式:定义函数模板后,函数调用时根据函数参数定义函数模板后,函数调用时根据函数参数来类型来确定调用哪个版本的函数。函数执来类型来确定调用哪个版本的函数。函数执行时确定参

69、数类型的函数称为模板函数。行时确定参数类型的函数称为模板函数。1471473.5函数模板函数模板此种形式调用中此种形式调用中称为函数模板的参数称为函数模板的参数一般可省略。一般可省略。Typename可替代可替代class1481483.5函数模板函数模板若某函数参数类型不一致时,也可定义函数若某函数参数类型不一致时,也可定义函数模板。模板。149149第四章类和对象第四章类和对象4.1类及其实例化类及其实例化4.1.1类的定义类的定义150150151151:称为域限定符,表示函数是类的成员函数。:称为域限定符,表示函数是类的成员函数。此时函数若要定义为内联,则加此时函数若要定义为内联,则加

70、inline关键字,关键字,类内定义的函数默认为内联函数。类内定义的函数默认为内联函数。152152注意:类定义时,数据成员的赋值必须写在某个注意:类定义时,数据成员的赋值必须写在某个函数的内部。一般使用类似函数的内部。一般使用类似set的函数进行赋值。的函数进行赋值。S1.set(1001,张三张三,22,99.5)类类student的的set函数应该怎么定义?函数应该怎么定义?1531534.1类及其实例化类及其实例化4.1.2使用类的对象使用类的对象类的对象的使用类似变量的使用。类的对象的使用类似变量的使用。声明声明声明声明/ / / /定义对象,直接利用对象名使用定义对象,直接利用对象

71、名使用定义对象,直接利用对象名使用定义对象,直接利用对象名使用通过对对象的引用使用对象通过对对象的引用使用对象通过对对象的引用使用对象通过对对象的引用使用对象通过指向对象的指针使用对象通过指向对象的指针使用对象通过指向对象的指针使用对象通过指向对象的指针使用对象1541544.1.2使用类的对象使用类的对象类的对象的使用类似变量的使用。类的对象的使用类似变量的使用。在在main函数中是否可按如下方式使用?函数中是否可按如下方式使用?1551554.1.2使用类的对象使用类的对象数据成员使用规律:数据成员使用规律:1,类的成员函数可以直接使用类的数据成员,类的成员函数可以直接使用类的数据成员2,

72、类外的函数不能使用类的私有成员,类外的函数不能使用类的私有成员3,类外的函数可以访问类的公有成员函数,类外的函数可以访问类的公有成员函数4,对象间的区别在于其属性值不同,对象间的区别在于其属性值不同1561564.1.3数据封装数据封装对象间利用公有成员函数进行通信。对象间利用公有成员函数进行通信。公用成员函数是对象的接口。公用成员函数是对象的接口。1571574.2构造函数构造函数4.2.1默认构造函数默认构造函数若类的定义中未定义构造函数,则若类的定义中未定义构造函数,则C+编译器编译器会自动产生一个不带参数的默认构造函数,类会自动产生一个不带参数的默认构造函数,类似于:似于:point(

73、)(),此时不对对象进行初始,此时不对对象进行初始化。化。若类中定义了构造函数,则不再产生默认构造若类中定义了构造函数,则不再产生默认构造函数。函数。1581584.2.2定义构造函数定义构造函数构造函数无返回值,这样可以减少编译器构造函数无返回值,这样可以减少编译器的工作,提高效率。的工作,提高效率。 构造函数与类同名。构造函数与类同名。 构造函数可以重载。构造函数可以重载。 构造函数系统自动调用。构造函数系统自动调用。 1591594.2.2定义构造函数定义构造函数初始化列表初始化列表1601604.2.3 构造函数和运算符构造函数和运算符new New和构造函数一同起作用,即和构造函数一

74、同起作用,即new首首先给对象分配内存,然后自动调用构造函数先给对象分配内存,然后自动调用构造函数来初始化这块内存。来初始化这块内存。 注意:注意:new建立的动态对象只能用建立的动态对象只能用delete删删除,一边释放空间。除,一边释放空间。1611614.2.4构造函数的默认参数构造函数的默认参数这是错误的,因为这是错误的,因为这是错误的,因为这是错误的,因为Point()Point()比有默认参数的函数少。比有默认参数的函数少。比有默认参数的函数少。比有默认参数的函数少。1621624.2.5复制构造函数复制构造函数 :(const(const &);); Point(Point &p

75、)Point(Point &p)比有默认参数的函数少,为什么它是对的。比有默认参数的函数少,为什么它是对的。比有默认参数的函数少,为什么它是对的。比有默认参数的函数少,为什么它是对的。1631634.3析构函数析构函数 析构函数的调用由编译器自动调用析构函数的调用由编译器自动调用 析构函数名在类名前加析构函数名在类名前加 析构函数无返回值析构函数无返回值 析构函数无参数,可以显示说明为析构函数无参数,可以显示说明为void 析构函数不可以重载析构函数不可以重载 析构函数在对象生命期结束的时候由系统自析构函数在对象生命期结束的时候由系统自动调用。动调用。1641644.3.1定义析构函数定义析构

76、函数 类的对象数组的每个元素调用一次构造函类的对象数组的每个元素调用一次构造函数,调用一次析构函数。数,调用一次析构函数。 全局对象数组的析构函数在程序结束之前全局对象数组的析构函数在程序结束之前被调用。被调用。 1651654.3.2析构函数和运算符析构函数和运算符delete delete后自动调用析构函数。与后自动调用析构函数。与new相反。相反。 p81 例例4.84.3.3默认析构函数默认析构函数 编译器为没有析构函数的类自动产生一个编译器为没有析构函数的类自动产生一个空体析构函数,与构造函数类似。空体析构函数,与构造函数类似。总结:分配几次内存调用几次构造函数,反之总结:分配几次内

77、存调用几次构造函数,反之调用析构函数调用析构函数1661664.4调用复制构造函数的综合实例调用复制构造函数的综合实例 p82【例例4.9】1671674.5成员函数重载及默认参数成员函数重载及默认参数 p85【例例4.10】1681684.6 this指针指针 this指针是指针是c+实现粉状的一种机制,它实现粉状的一种机制,它将对象和该对象调用的成员函数连接在一起。将对象和该对象调用的成员函数连接在一起。 this指针保证了每个对象可以拥有自己的指针保证了每个对象可以拥有自己的数据成员。数据成员。1691694.7一个类的对象作为另一个类的成员一个类的对象作为另一个类的成员 p87【例例4

78、.11】1701704.8类和对象的性质类和对象的性质4.8.1对象的性质对象的性质1.1.同一类的对象之间可以相互赋值;同一类的对象之间可以相互赋值;2.2.可以使用对象数组;可以使用对象数组;3.3.可以使用指向对象的指针;可以使用指向对象的指针;4.4.对象可以用作函数参数;对象可以用作函数参数;5.5.对象作为函数参数时,可以使用对象、对象对象作为函数参数时,可以使用对象、对象引用和对象指针;引用和对象指针;6.6.一个对象可以用作另一个类的成员。一个对象可以用作另一个类的成员。1711714.8.1类的性质类的性质1.1.使用类的权限使用类的权限2.2.不完全的类声明不完全的类声明n

79、只用当使用类产生对象时,才进行内存分配;只用当使用类产生对象时,才进行内存分配;只用当使用类产生对象时,才进行内存分配;只用当使用类产生对象时,才进行内存分配;n类没有完全定义之前就引用该类类没有完全定义之前就引用该类类没有完全定义之前就引用该类类没有完全定义之前就引用该类n不完全声明仅用于类和结构不完全声明仅用于类和结构不完全声明仅用于类和结构不完全声明仅用于类和结构3.3.空类空类4.4.类作用域类作用域n类中默认控制权限时类中默认控制权限时类中默认控制权限时类中默认控制权限时privateprivate 1721724.9面向对象的标记图面向对象的标记图 UML(Unified Mode

80、ling Language)时)时1992年面向对象管理组年面向对象管理组(OMG)制定的面向对象分析和设计的国)制定的面向对象分析和设计的国际标准。际标准。 UML时一种可视化建模语言,主要用于面时一种可视化建模语言,主要用于面向对象分析和建模。向对象分析和建模。1731734.9.1类和对象的类和对象的UML标记图标记图(识记识记) Car+ registration number: String- data: CarData+ speed: Integer + direction: Direction+ drive (speed: Integer, direction: Directio

81、n)+ getData (): CarDataCar+ registration number: String- data: CarData+ speed: Integer + direction: DirectionCar174174类名类名类名类名约束约束属性属性 : 类型类型 = 初始值初始值 操作操作 (参数列表参数列表):返回类型:返回类型对象名:类名对象名:类名属性属性 = 值值1751754.9.2对象的结构与连接对象的结构与连接(识记识记)1761764.10面向对象编程的文件规范面向对象编程的文件规范4.10.1 编译指令编译指令 (识记)(识记)4.10.2 在头文件中使用

82、条件编译(领会)在头文件中使用条件编译(领会) 177177第五章特殊函数和成员第五章特殊函数和成员5.1对象成员的初始化对象成员的初始化类的定义:类的定义:1781785.1对象成员的初始化对象成员的初始化1791795.1对象成员的初始化对象成员的初始化1801805.1对象成员的初始化对象成员的初始化示例示例【5.1】double 变成了其他类变成了其他类1811815.2静态成员静态成员成员定义时使用了成员定义时使用了static关键字关键字1,静态成员变量的初始化只能在类外进行。,静态成员变量的初始化只能在类外进行。2,类中的任何成员函数都可访问静态成员变量,类中的任何成员函数都可访

83、问静态成员变量3,访问静态成员时,一般加上类名限定。,访问静态成员时,一般加上类名限定。4,静态成员变量是类的成员,静态成员变量是类的成员,不是对象的成员不是对象的成员.5,对象未建立之前静态成员已经存在。,对象未建立之前静态成员已经存在。6,静态成员没有,静态成员没有this指针,除非使用引用方式指针,除非使用引用方式否则不能存取类的成员。否则不能存取类的成员。1821825.2静态成员静态成员-静态对象静态对象1831835.3友元函数友元函数可以实现两个类之间无限制的存取另一个类的成可以实现两个类之间无限制的存取另一个类的成员。员。友元函数可以访问私有成员,公有成员和保护成友元函数可以访

84、问私有成员,公有成员和保护成员。友元函数可以是一个类或函数。友元需通过员。友元函数可以是一个类或函数。友元需通过对象来使用类的成员。对象来使用类的成员。友元的三种形式:友元的三种形式:1,普通函数作一个类的友元,普通函数作一个类的友元2,a类的成员函数作类的成员函数作b类的友元类的友元3,a类作为类作为b类的友元类的友元1841845.3友元函数友元函数1,普通函数作一个类的友元,普通函数作一个类的友元 例例5.41851855.3友元函数友元函数2,a类的成员函数作类的成员函数作b类的友元类的友元1861865.3友元函数友元函数2,a类的成员函数作类的成员函数作b类的友元类的友元18718

85、75.3友元函数友元函数2,a类的成员函数作类的成员函数作b类的友元类的友元1881885.3友元函数友元函数3,a类作类作b类的友元类的友元189189总结:友元函数总结:友元函数可以实现两个类之间无限制的存取另一个类的成可以实现两个类之间无限制的存取另一个类的成员。员。友元函数可以访问私有成员,公有成员和保护成友元函数可以访问私有成员,公有成员和保护成员。友元函数可以是一个类或函数。友元需通过员。友元函数可以是一个类或函数。友元需通过对象来使用类的成员。对象来使用类的成员。友元的三种形式:友元的三种形式:1,普通函数作一个类的友元,普通函数作一个类的友元2,a类的成员函数作类的成员函数作b

86、类的友元类的友元3,a类作为类作为b类的友元类的友元1901905.4const对象对象const可限定变量、指针、对象、函数、数据可限定变量、指针、对象、函数、数据成员、成员函数。表示不可改变。成员、成员函数。表示不可改变。1,const成员成员 2,const对象对象 3,const函函数数1,const成员成员 区别于区别于const变量变量const变量定义时需要初始化。变量定义时需要初始化。const成员在构造函数中初始化成员在构造函数中初始化(初始化列表形式)(初始化列表形式)1911915.4const对象对象1,const成员成员 区别于区别于const变量变量1921925.

87、4const对象对象1,const成员成员 区别于区别于const变量变量1931935.4const对象对象2,const引用作参数引用作参数1941945.4const对象对象2,const对象和对象和const函数函数const 对象只能调用对象只能调用const成员函数成员函数const 函数中不允许使用改变变量或成员值的函数中不允许使用改变变量或成员值的语句语句195195复习上节复习上节对象初始化:构造函数两种定义形式。对象初始化:构造函数两种定义形式。 const限定的数据成员限定的数据成员 引用数据成员引用数据成员静态成员:静态数据成员,静态成员函数静态成员:静态数据成员,静态

88、成员函数友元:普通函数做友元友元:普通函数做友元 类的成员函数做友元类的成员函数做友元 类做友元类做友元const成员:成员:const数据成员(数据成员(const引用)引用) const成员函数成员函数 const对象对象196196复习上节复习上节类的对象数组:对象数组中的每个元素都是一类的对象数组:对象数组中的每个元素都是一 个个对象。对象。 对象数组元素的使用同普通对象对象数组元素的使用同普通对象使用。使用。对象的指针:对象的指针: 指向对象的指针使用对象的成员指向对象的指针使用对象的成员函数和数据成员。函数和数据成员。对象指针数组:数组中每个元素都是一个指向对对象指针数组:数组中每

89、个元素都是一个指向对象的指针。象的指针。指向函数的指针:函数有地址,指针能存地址,指向函数的指针:函数有地址,指针能存地址,指针可以指向函数。指针可以指向函数。1971975.5数组和类数组和类类可定义对象数组。类可定义对象数组。int a5; int a5=1,2,3,4,5;point p3;point p3=point(1,2), point(3,4), point(5,6)定义数组时未初始化调用定义数组时未初始化调用point()形式构造函数形式构造函数定义数组并初始化调用定义数组并初始化调用point(a,b)形式构造函数形式构造函数使用数组中的元素时利用:使用数组中的元素时利用:p

90、ointi形式形式Pointi的使用同普通对象使用方式相同的使用同普通对象使用方式相同1981985.5数组和类数组和类类可定义对象数组,可定义指向对象的指针类可定义对象数组,可定义指向对象的指针数组名是数组在内存中的首地址数组名是数组在内存中的首地址指针可以存放地址指针可以存放地址可用指针指向数组可用指针指向数组通过指针可以使用对象成员通过指针可以使用对象成员p-show()通过指针可以使用对象数组元素的成员通过指针可以使用对象数组元素的成员Pa;a0.show(); p-show();1991995.5数组和类数组和类定义对象的指针数组定义对象的指针数组int *p;表示定义一个指针变量表

91、示定义一个指针变量int p5;表示定义一个数组。;表示定义一个数组。int *p5 表示定义一个数组中有表示定义一个数组中有5个元素,个元素,每个元素是一个指针。每个元素是一个指针。此类数组称为指针数组。此类数组称为指针数组。point *p;p=new point;p=new point(1,2);2002005.5数组和类数组和类定义对象的指针数组定义对象的指针数组point *p3;p0=new point(1,2);p1=new point(3,4);p2=new point(5,6);通过通过p0使用使用p0指向的对象。指向的对象。p0-show();可通过循环使用可通过循环使用p

92、i指向的对象。指向的对象。2012015.5数组和类数组和类定义指向对象的指针数组,并初始化。定义指向对象的指针数组,并初始化。point *p3=new point(1,2), new point(3,4), new point(5,6) ;2022025.6指向成员函数的指针指向成员函数的指针函数被调用时需要调入内存函数被调用时需要调入内存函数有地址:存放函数的内存单元的首地址函数有地址:存放函数的内存单元的首地址指针可以存放地址指针可以存放地址存放函数地址的指针称为指向函数的指针存放函数地址的指针称为指向函数的指针定义形式:类型定义形式:类型 (*指针名指针名)(参数类型参数类型);20

93、32035.6指向成员函数的指针指向成员函数的指针int max(int a,int b)return ab?a:b;void main()int (*p)(int ,int );p=max;(*p)(1,2);2042045.6指向成员函数的指针指向成员函数的指针若若max函数是某类函数是某类A的成员函数则:的成员函数则:int A : max(int a,int b)return ab?a:b;void main()int (A : *p)(int ,int ); A a;p=A : max;a.(*p)(1,2);2052055.7求解一元二次方程求解一元二次方程利用利用C实现实现设计类

94、,定义类,设计类,定义类,定义定义main函数函数定义对象,定义对象,利用对象调用成员函数利用对象调用成员函数执行执行206206设计类设计类类的对象中应能存放相关数据:具有数据成员类的对象中应能存放相关数据:具有数据成员a,b,c一元二次方程的三个系数一元二次方程的三个系数x1,x2存放求得的方程解存放求得的方程解delta存放存放b*b-4*a*c类的对象应能完成计算功能:具有成员函数类的对象应能完成计算功能:具有成员函数1,将数据存入数据成员的函数,将数据存入数据成员的函数2,显示结果的函数,显示结果的函数3,计算,计算x1,x2的函数的函数207207定义类定义类208208设计类设计

95、类定义类的定义类的成员函数成员函数209209main函数函数210210main函数函数211211main函数函数212212main函数函数213213main函数函数214214第五章复习第五章复习构造函数定义:构造函数定义:class A int apublic: A(int x):a(x) A(int x)a=x;const限定的数据成员初始化必须用?形式?限定的数据成员初始化必须用?形式?还有什么数据成员必须用此种形式初始化?还有什么数据成员必须用此种形式初始化?const限定的数据成员和限定的数据成员和引用数据成员初始化必须引用数据成员初始化必须使用初始化列表形式。使用初始化列

96、表形式。215215静态成员静态成员 不依赖于对象而存在。不依赖于对象而存在。静态数据成员:定义时加静态数据成员:定义时加static静态成员必须初始化静态成员必须初始化使用语句:使用语句:int A:b=0;静态对象:静态对象:static对象一旦定义存在于内存中,直到程序结对象一旦定义存在于内存中,直到程序结束才释放内存。束才释放内存。216216静态成员静态成员 不依赖于对象而存在。不依赖于对象而存在。静态成员使用注意:静态成员使用注意:非静态对象非静态对象 静态成员静态成员 可否使用可否使用?静态对象静态对象 静态成员静态成员 可否使用可否使用?静态对象静态对象 非静态成员非静态成员

97、可否使用可否使用?静态成员函数静态成员函数 非静态成员非静态成员 可否使用?可否使用?非静态成员函数非静态成员函数 静态成员静态成员 可否使用?可否使用?217217静态成员静态成员 不依赖于对象而存在。不依赖于对象而存在。其他注意事项:其他注意事项: p108 1-7静态函数没有静态函数没有this指针指针不能声明为不能声明为virtual函数函数218218友元友元普通函数作友元普通函数作友元类的成员函数作友元类的成员函数作友元类作友元类作友元类类A的友元(函数,成员函数,类)可以访问类的友元(函数,成员函数,类)可以访问类A中的所有成员,但必须通过对象或引用来访问。中的所有成员,但必须通

98、过对象或引用来访问。友元应在类友元应在类A中利用中利用friend声明声明219219const对象对象const数据成员数据成员const成员函数成员函数const指针指针const变量变量const引用引用加加const限定后不可改变,任何企图改变都导致限定后不可改变,任何企图改变都导致错误,并应注意他们的初始化!错误,并应注意他们的初始化!220220使用规则:使用规则:const对象对象 不能调用任何非不能调用任何非const成员函数成员函数const成员函数只能调用成员函数只能调用const成员函数成员函数非非const对象可以调用对象可以调用const成员函数成员函数非非const

99、对象可以使用对象可以使用const数据成员数据成员const成员函数中不能使用任何试图改变变量值成员函数中不能使用任何试图改变变量值的语句。的语句。221221数组和类数组和类类可以定义对象类可以定义对象类可以定义对象数组类可以定义对象数组对象数组中的每个元素都是对象,其使用方式和对象数组中的每个元素都是对象,其使用方式和对象的使用方式相同。对象的使用方式相同。对象数组名表示数组的首地址对象数组名表示数组的首地址可以定义指向对象的指针可以定义指向对象的指针p使其指向某个对象使其指向某个对象可以用指针可以用指针p指向数组中的元素指向数组中的元素222222对象的指针数组使用对象的指针数组使用函数

100、指针定义形式:函数指针定义形式:int (*p)()(int,int););int (A:*P)()(int,int););int max(int a,int b) int A:max(int a,int b) 223223习题五习题五-1224224习题五习题五-1225225习题五习题五-1226226习题五习题五-1227227习题五习题五-1228228习题五习题五-4229229习题五习题五-4230230第六章继承和派生第六章继承和派生6.1继承和派生的基本概念继承和派生的基本概念继承关系是类与类之间的类属关系继承关系是类与类之间的类属关系类:人类:人类:学生类:学生类:教师类:教

101、师在已有类的基础上定义新的类称为类的派生,新在已有类的基础上定义新的类称为类的派生,新产生的类为派生类,原来的类为基类。产生的类为派生类,原来的类为基类。(一般与特殊的关系一般与特殊的关系)2312316.1继承和派生的基本概念继承和派生的基本概念继承关系是类与类之间的类属关系继承关系是类与类之间的类属关系类:人类:人类:学生类:学生类:教师类:教师从成员构成来看,派生类具有基类的所有成员,从成员构成来看,派生类具有基类的所有成员,基类又叫父类,派生类又叫子类。基类又叫父类,派生类又叫子类。2322326.1继承和派生的基本概念继承和派生的基本概念类的继承是指:派生类继承基类的所有数据成员类的

102、继承是指:派生类继承基类的所有数据成员和成员函数。用于表示类间的类属关系。非构成和成员函数。用于表示类间的类属关系。非构成关系。关系。派生类的特点:派生类的特点:1,增加新成员。,增加新成员。2,重定义已有成员函数。,重定义已有成员函数。3,改变基类的成员的访问权限。,改变基类的成员的访问权限。2332336.1继承和派生的基本概念继承和派生的基本概念人人学生学生教师教师姓名、年龄、性别。姓名、年龄、性别。2342346.2单一继承单一继承6.2.1一般形式一般形式class 派生类名:访问控制派生类名:访问控制 基类名基类名 private: 成员列表;成员列表; public: 成员列表;

103、成员列表; protected: 成员列表;成员列表;2352356.2单一继承单一继承6.2.2派生类的构造函数和析构函数派生类的构造函数和析构函数派生类中继承的基类的成员初始化时,需要由派生类中继承的基类的成员初始化时,需要由派生类的构造函数调用基类的构造函数。派生类的构造函数调用基类的构造函数。派生类的构造函数一般形式:派生类的构造函数一般形式:派生类名:派生类名派生类名:派生类名(参数参数):基类名:基类名(参数参数) /函数体函数体构造函数和析构函数不能被继承。构造函数和析构函数不能被继承。2362366.2单一继承单一继承类的派生实例类的派生实例有类有类human对象用于存放人的相

104、关信息:对象用于存放人的相关信息:姓名,年龄,性别姓名,年龄,性别并能利用成员函数实现相关信息输出。并能利用成员函数实现相关信息输出。在此基础上定义类在此基础上定义类student类,具有学号、班类,具有学号、班级信息,级信息,并能完成信息的输出显示。并能完成信息的输出显示。定义类,并设计测试程序。定义类,并设计测试程序。2372376.2.2派生类的构造函数和析构函数派生类的构造函数和析构函数2382386.2.2派生类的构造函数和析构函数派生类的构造函数和析构函数2392396.2.2派生类的构造函数和析构函数派生类的构造函数和析构函数2402406.2.2派生类的构造函数和析构函数派生类

105、的构造函数和析构函数运行结果:运行结果:问题:在问题:在student类中类中能否直接使用能否直接使用human类类中的中的name,sex,age等成员?等成员?2412416.2.2派生类的构造函数和析构函数派生类的构造函数和析构函数此时程序无法运行!此时程序无法运行!2422426.2.2派生类的构造函数和析构函数派生类的构造函数和析构函数类类A定义中由定义中由private限定的成员只能在类限定的成员只能在类A中中使用。使用。student虽然是虽然是human的派生类也不可使用的派生类也不可使用human类中的类中的private成员,所以在成员,所以在student中定义的中定义的

106、show函数不可使用函数不可使用human中的中的name,sex,age等私有成员。等私有成员。2432436.2.3类的保护成员类的保护成员protected公有派生得到的派生类不能使用基类的私有成员。公有派生得到的派生类不能使用基类的私有成员。那么如何解决派生类中访问基类的成员呢?并且不那么如何解决派生类中访问基类的成员呢?并且不能打破封装性:基类的对象仍不可使用这些成员。能打破封装性:基类的对象仍不可使用这些成员。2442446.2.3类的保护成员类的保护成员protected公有派生得到的派生类不能使用基类的私有成员。公有派生得到的派生类不能使用基类的私有成员。protected限定

107、的成员具有公有和私有双重性质限定的成员具有公有和私有双重性质该类成员在派生类中可访问该类成员在派生类中可访问,其他非成员函数不可其他非成员函数不可访问。访问。2452456.2.3类的保护成员类的保护成员protected2462466.2.3类的保护成员类的保护成员protected2472476.2.3类的保护成员类的保护成员protected2482486.2.3类的保护成员类的保护成员protected公有派生得到的派生类不能使用基类的私有成员。公有派生得到的派生类不能使用基类的私有成员。protected限定的成员具有公有和私有双重性质限定的成员具有公有和私有双重性质该类成员在派生类

108、中可访问该类成员在派生类中可访问,其他函数不可访问。其他函数不可访问。249249复习上节复习上节基类、派生类、继承基类、派生类、继承派生类的特点:派生类的特点:1,增加新成员,增加新成员2,重定义已有函数,重定义已有函数3,改变成员访问权限,改变成员访问权限250250复习上节复习上节派生类的定义形式:派生类的定义形式:class 派生类名:访问控制派生类名:访问控制 基类名基类名 private: 成员列表;成员列表; public: 成员列表;成员列表; protected: 成员列表;成员列表;访问控制访问控制访问控制访问控制私有派生私有派生私有派生私有派生公有派生公有派生公有派生公有

109、派生保护派生保护派生保护派生保护派生251251复习上节复习上节派生类的定义形式:派生类的定义形式:公有派生的特点:公有派生的特点:派生类中可访问基类中的派生类中可访问基类中的protected成员成员派生类中可访问基类中的派生类中可访问基类中的public成员成员派生类中不可访问基类中的派生类中不可访问基类中的private成员成员252252复习上节复习上节公有派生和保护成员公有派生和保护成员protected限定的成员具有公有和私有双重性质限定的成员具有公有和私有双重性质在基类中是私有的,在派生类中可访问。在基类中是私有的,在派生类中可访问。问题:问题:1,基类的对象是否可访问,基类的对

110、象是否可访问protected成员?成员?2,派生类的对象是否可访问公有派生类中继承自,派生类的对象是否可访问公有派生类中继承自基类的基类的protected成员?成员?3,基类的成员函数是否可访问基类中的,基类的成员函数是否可访问基类中的protected成员?成员?4,派生类的成员函数是否可访问公有派生类中继,派生类的成员函数是否可访问公有派生类中继承自基类的承自基类的protected成员?成员?253253复习上节复习上节派生类的构造函数和析构函数:派生类的构造函数和析构函数:派生类的构造函数不能由基类继承而得派生类的构造函数不能由基类继承而得派生类的构造函数一般形式:派生类的构造函数

111、一般形式:派生类名:派生类名派生类名:派生类名(参数参数):基类名:基类名(参数参数) /函数体函数体254254复习上节复习上节派生类的构造函数和析构函数:派生类的构造函数和析构函数:当产生一个派生类对象时,首先调用基类的构当产生一个派生类对象时,首先调用基类的构造函数,然后调用派生类的构造函数。造函数,然后调用派生类的构造函数。当释放一个派生类对象时,首先调用派生类的当释放一个派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。析构函数,然后调用基类的析构函数。2552556.2.3类的保护成员类的保护成员protected2562566.2.4访问权限访问权限1,公有派生和赋

112、值兼容规则,公有派生和赋值兼容规则a,基类的公有成员在派生类中仍是公有的。,基类的公有成员在派生类中仍是公有的。b,基类的保护成员在派生类中仍是保护的。,基类的保护成员在派生类中仍是保护的。c,基类的私有成员在派生类中是不可访问的。,基类的私有成员在派生类中是不可访问的。d,基类的不可访问成员在派生类中仍不可访问。,基类的不可访问成员在派生类中仍不可访问。什么是类的不可访问成员?什么是类的不可访问成员?例如:若例如:若human类中类中name是是private的,的,则,则,student类不可访问类不可访问若若student做某个类做某个类A的基类时,类的基类时,类A仍不可访仍不可访问问n

113、ame2572576.2.4赋值兼容规则赋值兼容规则基类对象和派生类对象的相互赋值。基类对象和派生类对象的相互赋值。每个学生都是人。每个学生都是人。说明:说明:student类的每个对象都是类的每个对象都是human类的类的对象。对象。每个人不一定是学生。每个人不一定是学生。说明:说明:human类的每个对象不一定是类的每个对象不一定是student类的对象。类的对象。2582586.2.4赋值兼容规则赋值兼容规则基类对象和派生类对象的相互赋值。基类对象和派生类对象的相互赋值。每个学生都是人。每个学生都是人。说明:说明:student类的每个对象都是类的每个对象都是human类的类的对象。对象

114、。a,派生类的对象可赋值给基类的对象。,派生类的对象可赋值给基类的对象。b,派生类的对象可以初始化基类的引用,派生类的对象可以初始化基类的引用c,派生类的对象地址可赋值给基类的指针,派生类的对象地址可赋值给基类的指针此时基类的引用或指针只能访问派生类中继承自此时基类的引用或指针只能访问派生类中继承自基类的成员。基类的成员。2592596.2.4赋值兼容规则赋值兼容规则a,派生类的对象可赋值给基类的对象。,派生类的对象可赋值给基类的对象。b,派生类的对象可以初始化基类的引用,派生类的对象可以初始化基类的引用c,派生类的对象地址可赋值给基类的指针,派生类的对象地址可赋值给基类的指针此时基类的对象、

115、引用或指针只能访问派生类中此时基类的对象、引用或指针只能访问派生类中继承自原基类的成员。继承自原基类的成员。ph-show();2602606.2.4 isa和和has-a的区别的区别类与类间的关系:类与类间的关系:isa关系:关系: 继承和派生关系。继承和派生关系。has-a关系:关系: 一个类使用另一个类的对象作成一个类使用另一个类的对象作成员员一般来说:公有继承关系和一般来说:公有继承关系和isa关系是等价的。关系是等价的。但某些情况下:但某些情况下: 企鹅是鸟企鹅是鸟 鸟会飞鸟会飞 企鹅会飞吗?企鹅会飞吗? 对象作成员表示对象作成员表示has-a关系关系2612616.2.4 公有继承

116、存取权限表公有继承存取权限表什么是公有继承?什么是公有继承?基类基类派生类派生类基类对象基类对象 派生类对象派生类对象privatepublicprotected不可访问不可访问publicprotected不可访问不可访问可访问可访问不可访问不可访问不可访问不可访问可访问可访问不可访问不可访问2622626.2.4 私有派生私有派生定义派生类时,用定义派生类时,用private限定限定class 派生类名:派生类名:private 基类名基类名 private: 成员列表;成员列表; public: 成员列表;成员列表; protected: 成员列表;成员列表;2632636.2.4 私有

117、派生私有派生定义派生类时,用定义派生类时,用private限定限定基类的私有成员和不可访问成员在派生类中不基类的私有成员和不可访问成员在派生类中不可访问可访问基类的公有成员和保护成员变为私有成员基类的公有成员和保护成员变为私有成员2642646.2.4 私有派生私有派生假定有基类:假定有基类:base2652656.2.4 私有派生私有派生定义派生类时,用定义派生类时,用private限定限定问题:问题:2662666.2.4 私有派生私有派生定义派生类时,用定义派生类时,用private限定限定问题:问题:d对象是对象是否可以使用否可以使用fun1函数?函数?2672676.2.4 私有派生

118、私有派生定义派生类时,用定义派生类时,用private限定限定基类的私有成员和不可访问成员在派生类中不基类的私有成员和不可访问成员在派生类中不可访问可访问基类的公有成员和保护成员变为私有成员基类的公有成员和保护成员变为私有成员派生类的对象不可访问继承自基类的所有成员,派生类的对象不可访问继承自基类的所有成员,派生类的成员函数可访问继承自基类的派生类的成员函数可访问继承自基类的protectedprotected成员和成员和publicpublic成员成员2682686.2.4 保护派生保护派生定义派生类时,用定义派生类时,用protected限定限定降级使用降级使用基类中的基类中的privat

119、e变为不可访问变为不可访问 protect变为变为private public 变为变为protected 269269270270降级使用降级使用基类中的基类中的private变变为不可访问为不可访问protected变为变为privatepublic 变为变为protected 2712716.3多重继承多重继承一般形式一般形式:class 类类1:访问控制访问控制 类类2, 访问控制访问控制 类类3private: /私有成员私有成员protected: /保护成员保护成员public: /公有成员公有成员272272273273多重继承中成员访问权限的变化同单一继承!多重继承中成员访问

120、权限的变化同单一继承!以下访问是指在派生类的成员函数中使用成员以下访问是指在派生类的成员函数中使用成员公有派生:公有派生:基类的基类的private成员在派生类中可否访问?成员在派生类中可否访问?基类的基类的protected成员在派生类中可否访问?成员在派生类中可否访问?基类的基类的public成员在派生类中可否访问?成员在派生类中可否访问?私有派生:私有派生:基类的基类的private成员在派生类中可否访问?成员在派生类中可否访问?基类的基类的protected成员在派生类中可否访问?成员在派生类中可否访问?基类的基类的public成员在派生类中可否访问?成员在派生类中可否访问?27427

121、4多重继承中成员访问权限的变化同单一继承!多重继承中成员访问权限的变化同单一继承!保护派生:保护派生:基类的基类的private成员在派生类中可否访问?成员在派生类中可否访问?基类的基类的protected成员在派生类中可否访问?成员在派生类中可否访问?基类的基类的public成员在派生类中可否访问?成员在派生类中可否访问?2752756.4二义性及其支配规则二义性及其支配规则6.4.1作用域和成员名限定作用域和成员名限定2762766.4二义性及其支配规则二义性及其支配规则6.4.1作用域和成员名限定作用域和成员名限定2772776.4二义性及其支配规则二义性及其支配规则6.4.1作用域和成

122、员名限定作用域和成员名限定2782786.4二义性及其支配规则二义性及其支配规则6.4.1作用域和成员名限定作用域和成员名限定当派生类中从当派生类中从多个基类中继多个基类中继承得到同名函承得到同名函数时,在派生数时,在派生类中使用这些类中使用这些函数时,须使函数时,须使用类名限定!用类名限定!派生类的对象派生类的对象使用这些函数使用这些函数时,也需要进时,也需要进行类名限定!行类名限定!类名:成员名类名:成员名2792796.4二义性及其支配规则二义性及其支配规则6.4.2派生类支配基类的同名函数派生类支配基类的同名函数2802806.4.2派生类支配基类的同名函数派生类支配基类的同名函数C+

123、C+的支配规则:的支配规则: 在基类和派生类有重名的成员时,优先派生在基类和派生类有重名的成员时,优先派生类的成员如果要访问基类成员,必须加上作用类的成员如果要访问基类成员,必须加上作用域符域符:私有私有(private)(private)成员派生类不可以访问,只成员派生类不可以访问,只有本类和友类可以访问有本类和友类可以访问如果派生类要访问基类的成员,基类成员应如果派生类要访问基类的成员,基类成员应该用该用protectedprotected限定。限定。 2812816.4.2派生类支配基类的同名函数派生类支配基类的同名函数另注意:另注意:一个类一个类B B不能从类不能从类A A直接继承直接

124、继承2 2或或2 2次以上次以上 282282第六章复习总结第六章复习总结类的单一公有继承、单一私有继承、单一保护类的单一公有继承、单一私有继承、单一保护继承、多重继承继承、多重继承 规则规则派生类的构造函数定义形式,及调用顺序派生类的构造函数定义形式,及调用顺序派生类的析构函数调用顺序。派生类的析构函数调用顺序。protectedprotected成员成员派生类和基类对象的赋值兼容规则派生类和基类对象的赋值兼容规则二义性及其支配规则(作用域限定)二义性及其支配规则(作用域限定)283283第七章类模板与向量第七章类模板与向量7.1类模板类模板复习内容:函数模板复习内容:函数模板2842843

125、.5函数模板函数模板有些函数重载时参数个数相同,只是类有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利型不同,此时重载函数比较繁琐,可利用函数模板实现。用函数模板实现。2852853.5函数模板函数模板有些函数重载时参数个数相同,只是类有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利型不同,此时重载函数比较繁琐,可利用函数模板实现。用函数模板实现。2862863.5函数模板函数模板有些函数重载时参数个数相同,只是类有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利型不同,此时重载函数比较繁琐,可利用函数模板实现。用函数模板实现。2872

126、873.5函数模板函数模板函数模板定义格式:函数模板定义格式:定义函数模板后,函数调用时根据函数参数定义函数模板后,函数调用时根据函数参数来类型来确定调用哪个版本的函数。函数执来类型来确定调用哪个版本的函数。函数执行时确定参数类型的函数称为模板函数。行时确定参数类型的函数称为模板函数。2882883.5函数模板函数模板此种形式调用中此种形式调用中称为函数模板的参数称为函数模板的参数一般可省略。一般可省略。Typename可替代可替代class2892893.5函数模板函数模板若某函数参数类型不一致时,也可定义函数若某函数参数类型不一致时,也可定义函数模板。模板。2902907.1类模板类模板7

127、.1.1类模板的基础知识类模板的基础知识templateclass 类名类名Private: /成员定义成员定义Protected: /成员定义成员定义Public: /成员定义成员定义2912917.1类模板类模板template class 类名类名 类模板的对象类模板的对象: 类名类名 对象名对象名(参数参数); 2922927.1类模板类模板类的成员函数定义(在类体外定义时):类的成员函数定义(在类体外定义时):模板类的成员函数定义形式:模板类的成员函数定义形式:template template 返回值类型返回值类型 类名类名 : 函数名函数名(参数参数) /函数体函数体 普通类的成

128、员函数定义形式:普通类的成员函数定义形式:返回值类型返回值类型 类名类名 : 函数名函数名(参数参数) /函数体函数体 2932937.1类模板类模板2942947.1类模板类模板2952957.1.2类模板的派生与继承类模板的派生与继承2962967.1.2类模板的派生与继承类模板的派生与继承模板类继承普通类,模板类作普通类的派生类模板类继承普通类,模板类作普通类的派生类继承后成员使用同一般类的继承。继承后成员使用同一般类的继承。模板类派生模板类模板类派生模板类模板类使用时,须指出模板类参数模板类使用时,须指出模板类参数2972972982987.2向量与泛型算法向量与泛型算法7.2.1定义

129、向量列表定义向量列表向量是向量是C+中一维数组的类版本中一维数组的类版本用于存放多个相同类型的数据。用于存放多个相同类型的数据。可动态指定向量中元素的个数,并提供了多个可动态指定向量中元素的个数,并提供了多个成员函数以方便数据使用,成员函数以方便数据使用,同时可使用泛型算法。同时可使用泛型算法。是是C+中的类模板。使用时加头文件中的类模板。使用时加头文件vector2992997.2向量与泛型算法向量与泛型算法7.2.1定义向量列表定义向量列表向量的声明形式:向量的声明形式:vector 向量名;向量名;vector 向量名向量名(长度长度);vector 向量名向量名(长度,长度,a);ve

130、ctor 向量名向量名1(向量名向量名2);vector 向量名向量名(a , a+长度长度); (a是数组名是数组名)3003007.2向量与泛型算法向量与泛型算法7.2.1定义向量列表定义向量列表向量的使用:向量的使用:同类型向量可相互赋值,不同类型不可相互赋值同类型向量可相互赋值,不同类型不可相互赋值同类向量长度不同也可相互赋值同类向量长度不同也可相互赋值向量中的元素使用类似数组元素,可使用向量中的元素使用类似数组元素,可使用ai向量具有成员函数向量具有成员函数size()可得到向量长度()可得到向量长度301301向量的使用:向量的使用:302302向量的使用:向量的使用:303303

131、7.2.2泛型指针泛型指针向量成员函数向量成员函数begin(),end(),begin(),end()vector a(10,0););a.begin()表示向量中第表示向量中第0个元素的地址个元素的地址a.end() 表示最后一个元素后下一个地址表示最后一个元素后下一个地址a.rbegin()表示向量中最后一个元素的地址表示向量中最后一个元素的地址a.rend() 表示第一个前一个地址表示第一个前一个地址0 1 2 3 4 5 6 7 8 93043047.2.2泛型指针泛型指针向量成员函数向量成员函数begin(),end(),rbegin(),rend()可以取得向量中某个元素地址可以

132、取得向量中某个元素地址指针可以存放地址指针可以存放地址注意:指针类型必须同向量类型一致注意:指针类型必须同向量类型一致3053057.2.2泛型指针泛型指针3063067.2.2泛型指针泛型指针输出向量元素输出向量元素向量使用时类似数组使用:向量使用时类似数组使用:3073077.2.2泛型指针泛型指针输出向量元素输出向量元素利用向量的成员函数输出向量元素利用向量的成员函数输出向量元素0 1 2 3 4 5 6 7 8 93083087.2.2泛型指针泛型指针输出向量元素输出向量元素利用向量的成员函数输出向量元素利用向量的成员函数输出向量元素0 1 2 3 4 5 6 7 8 93093097

133、.2.2泛型指针泛型指针输出向量元素输出向量元素利用向量的成员函数输出向量元素利用向量的成员函数输出向量元素0 1 2 3 4 5 6 7 8 93103107.2.2泛型指针泛型指针利用普通指针指向向量的首元素地址,利用指利用普通指针指向向量的首元素地址,利用指针输出向量元素。针输出向量元素。3113117.2.2泛型指针泛型指针类模板类模板vector中提供了一个通用指针中提供了一个通用指针iterator可使用可使用 vector:iterator 指针名指针名形式定义一个指向向量的指针形式定义一个指向向量的指针该指针可指向向量中的元素。该指针可指向向量中的元素。312312313313

134、7.2.2泛型指针泛型指针类模板类模板vector中提供了一个通用指针中提供了一个通用指针reverse_iterator可使用可使用vector:reverse_iterator 指针名指针名形式定义一个指向向量的指针形式定义一个指向向量的指针该指针可指向向量中的元素。该指针可指向向量中的元素。314314315315特别注意特别注意(总结)(总结)向量不是数组!向量名不是数组名,不表示地向量不是数组!向量名不是数组名,不表示地址!也不可使用址!也不可使用&区向量元素的首地址!区向量元素的首地址!int *p; vector c;p=c;p=&c; 不可使用如此形式!不可使用如此形式!316

135、316特别注意特别注意(总结)(总结)向量的成员函数向量的成员函数begin() +1,表示下一个地址,表示下一个地址end()-1表示前一个地址表示前一个地址rbegin()+1表示前一个地址表示前一个地址rend()-1表示下一个地址表示下一个地址317317特别注意:特别注意: (总结)(总结)(总结)(总结)reverse_iterator 指针变量指针变量只能被赋值为只能被赋值为c.rbegin(),c.rend()int *p; 或者或者 vector:reverse_iterator p;p=c.rbegin() 此形式错误!此形式错误!p=c.rend() 此形式错误!此形式错

136、误!p=c.begin() 正确正确p=c.end() 正确正确318318特别注意:特别注意: (总结)(总结)(总结)(总结)普通指针变量和普通指针变量和iterator 指针变量指针变量只能被赋值为只能被赋值为c.begin(),c.end()int *p; 或者或者 vector:iterator p;p=c.rbegin() 此形式错误!此形式错误!p=c.rend() 此形式错误!此形式错误!p=c.begin() 正确正确p=c.end() 正确正确3193197.2.3向量的数据类型向量的数据类型向量不仅可以存取向量不仅可以存取int,double等普通数据等普通数据类型,也可

137、存储对象,指针,对象的指针类型,也可存储对象,指针,对象的指针320320321321向量存取对象的指针向量存取对象的指针3223227.2.3向量的数据类型向量的数据类型利用泛型算法对向量进行操作利用泛型算法对向量进行操作copysortfindreverse_copy3233237.2.3向量的数据类型向量的数据类型利用泛型算法对向量进行操作利用泛型算法对向量进行操作3243247.2.3向量的数据类型向量的数据类型利用泛型算法对向量进行操作利用泛型算法对向量进行操作3253257.2.3向量的数据类型向量的数据类型利用泛型算法对向量进行操作利用泛型算法对向量进行操作3263267.2.4

138、向量最基本的操作方法向量最基本的操作方法1,向量容量向量容量size(),max_size(),capacity(),empty()用于得到当前向量的大小信息用于得到当前向量的大小信息3273277.2.4向量最基本的操作方法向量最基本的操作方法2,使用向量中存放的对象,使用向量中存放的对象front(),back(), ia.front()a.back()ai表示向量中存放的第表示向量中存放的第i个对象。个对象。3283287.2.4向量最基本的操作方法向量最基本的操作方法3,向量中插入对象,向量中插入对象push_back(const T &)insert(iterator it,cons

139、t T & )insert(iterator it,size_type n, const T)329329当当size超出超出capacity时,时,capacity翻倍扩容翻倍扩容330330insert插入到指针位置之前插入到指针位置之前331331insert插入到指针位置之前插入到指针位置之前并重复插入并重复插入n个个3323327.2.4向量最基本的操作方法向量最基本的操作方法4,向量中删除对象,向量中删除对象pop_back()erase(iterator it )clear()333333pop_back()删除最后一个对象删除最后一个对象334334erase删除指定位置的对象

140、删除指定位置的对象335335clear清除所有对象清除所有对象3363367.4出圈游戏出圈游戏12345678910113373377.4出圈游戏出圈游戏3383387.4出圈游戏出圈游戏3393397.4出圈游戏出圈游戏340340第八章多态性和虚函数第八章多态性和虚函数8.1多态性多态性8.1.1静态联编中的赋值兼容性和名字支配规律静态联编中的赋值兼容性和名字支配规律类的对象和调用的函数一一对应,程序编译时即类的对象和调用的函数一一对应,程序编译时即可确定对象调用哪一个函数,称为静态联编可确定对象调用哪一个函数,称为静态联编通过指针调用成员函数时:通过指针调用成员函数时:所调用成员函数

141、为指针所属类的成员函数所调用成员函数为指针所属类的成员函数即由赋值兼容规则决定指针调用的成员函数即由赋值兼容规则决定指针调用的成员函数3413413423428.1.2动态联编的多态性动态联编的多态性要实现程序运行时决定指针所调用的函数是基类要实现程序运行时决定指针所调用的函数是基类的还是派生类的,即:动态联编。的还是派生类的,即:动态联编。可利用虚函数实现动态联编可利用虚函数实现动态联编3433438. 2虚函数虚函数虚函数的格式:虚函数的格式: virtual double area()return 0;虚函数的调用规则:虚函数的调用规则:根据当前对象,优先调用对象本省的虚成员函数。根据当

142、前对象,优先调用对象本省的虚成员函数。虚函数不能是静态成员。虚函数不能是静态成员。3443448. 2 . . 2虚函数实现多态性虚函数实现多态性使用虚函数产生多态的个前提:使用虚函数产生多态的个前提:、类之间的继承关系满足赋值兼容性规则;、类之间的继承关系满足赋值兼容性规则;、改写了同名虚函数;、改写了同名虚函数;、根据赋值兼容性规则使用指针(或引用)。、根据赋值兼容性规则使用指针(或引用)。其中前提分为两种情况:其中前提分为两种情况:、按赋值兼容性规则使用基类指针(或引用)、按赋值兼容性规则使用基类指针(或引用)访问虚函数;访问虚函数;、把指针(或引用)作为函数参数,即这个函、把指针(或引

143、用)作为函数参数,即这个函数不一定是类的成员函数,可以是普通函数,而数不一定是类的成员函数,可以是普通函数,而且可以重载。且可以重载。【P171中的中的display函数函数】 345345.构造函数和析构函数调用虚函数构造函数和析构函数调用虚函数重要规则重要规则:采用静态联编,即只调用自己的类或:采用静态联编,即只调用自己的类或基类中定义的函数,但不是任何在派生类中重定基类中定义的函数,但不是任何在派生类中重定义的虚函数。义的虚函数。P83new和构造函数和构造函数delete和析构函数和析构函数标准标准c+不支持虚构造函数不支持虚构造函数支持虚析构函数,支持虚析构函数,如果基类的虚析构函数

144、,则派如果基类的虚析构函数,则派生类的析构函数是否用生类的析构函数是否用virtual说明,均为虚析说明,均为虚析构函数;如派生类未定义析构函数,则编译器生构函数;如派生类未定义析构函数,则编译器生成的也是虚析构函数。成的也是虚析构函数。3463468. 2 .4 纯虚函数与抽象类纯虚函数与抽象类、纯虚函数的格式、纯虚函数的格式class 类名类名 virtual 函数类型函数类型 函数名函数名(参数列表参数列表)=0; ;、抽象类、抽象类包含纯虚数的类称为抽象类。包含纯虚数的类称为抽象类。 3473478. 2 .48. 2 .4 纯虚函数与抽象类纯虚函数与抽象类纯虚函数与抽象类纯虚函数与抽

145、象类抽象类的派生类如果没有实现抽象类中的全部纯抽象类的派生类如果没有实现抽象类中的全部纯虚函数,这个派生类依旧是抽象类。虚函数,这个派生类依旧是抽象类。纯虚函数与空的虚函数是不同的:纯虚函数与空的虚函数是不同的:、virtual void area()=0;、virtual void area() 3483488. 3多重继承与虚函数(识记)多重继承与虚函数(识记)多重继承是多个单一继承的集合。多重继承是多个单一继承的集合。p176 8. 4类成员函数的指针与多态性(识记)类成员函数的指针与多态性(识记)在派生类中,当一个指向基类成员函数的指针指在派生类中,当一个指向基类成员函数的指针指向一个

146、虚函数,并且通过指向对象的基类指针向一个虚函数,并且通过指向对象的基类指针(或引用)访问这个虚函数时,会发生多态性。(或引用)访问这个虚函数时,会发生多态性。p176 349349第九章第九章 运算符重载和流类库运算符重载和流类库9.1运算符重载运算符重载9.1.1 重载对象的赋值运算符重载对象的赋值运算符编译器在默认情况下为每个类生成一个默编译器在默认情况下为每个类生成一个默认的赋值操作。认的赋值操作。【p184】3503509.1.2 运算符重载的实质运算符重载的实质根据函数重载的概念,可以理解:根据函数重载的概念,可以理解:7/2 与与7.0/2.0中中“/ /”的不同。的不同。所以,由

147、于操作的数据不同而具有不同意义的运所以,由于操作的数据不同而具有不同意义的运算符称为算符称为“运算符重载运算符重载”。为用户定义的类型重载运算符都要求能够访问这为用户定义的类型重载运算符都要求能够访问这个类型的个类型的私有成员私有成员,所以:,所以:将类作为类的成员函数的重载运算符称为类运算符;将类作为类的成员函数的重载运算符称为类运算符;将类作为类的成员函数的重载运算符称为类运算符;将类作为类的成员函数的重载运算符称为类运算符;将作为类的友元重载运算符称为友元运算符。将作为类的友元重载运算符称为友元运算符。将作为类的友元重载运算符称为友元运算符。将作为类的友元重载运算符称为友元运算符。351

148、3519.1.3 和和+运算符重载实例运算符重载实例插入符函数的一般形式:插入符函数的一般形式:ostream &operator(ostream& output, ostream &operator(istream& input, istream &operator(istream& input, 类名类名类名类名& & 对象名对象名对象名对象名) ) return input;return input; 注意:不能自己定义新的运算符。注意:不能自己定义新的运算符。注意:不能自己定义新的运算符。注意:不能自己定义新的运算符。【p187】【】【p188】【】【p189】3523529.1.4

149、9.1.4 类类类类运算符和友元运算符的区别(识记)运算符和友元运算符的区别(识记)运算符和友元运算符的区别(识记)运算符和友元运算符的区别(识记)如果运算符所需的操作数(尤其是第一个操作数)如果运算符所需的操作数(尤其是第一个操作数)如果运算符所需的操作数(尤其是第一个操作数)如果运算符所需的操作数(尤其是第一个操作数)希望进行隐式类型转换,则运算符通过希望进行隐式类型转换,则运算符通过希望进行隐式类型转换,则运算符通过希望进行隐式类型转换,则运算符通过友元运算友元运算友元运算友元运算符符符符来重载。来重载。来重载。来重载。如果一个运算符的操作需要修改类对象的状态,如果一个运算符的操作需要修

150、改类对象的状态,如果一个运算符的操作需要修改类对象的状态,如果一个运算符的操作需要修改类对象的状态,则使用则使用则使用则使用类运算符类运算符类运算符类运算符。【 P191P191 】3533539.1.5 9.1.5 下标下标下标下标运算符运算符运算符运算符“ “ ” ”的重载(识记)的重载(识记)的重载(识记)的重载(识记)【P192P192】3543549. 2流类库流类库9.2.1 流类库的基础类(流类库的基础类(识记识记识记识记)把接受输出数据的地方叫做把接受输出数据的地方叫做目标目标把输入数据来自的地方叫做把输入数据来自的地方叫做源源流类:流类:执行输入、输入执行输入、输入3553559. 2流类库流类库使用使用 3563569. 2流类库流类库使用使用 3573579. 2流类库流类库使用使用 358358第十章面向对象设计实例第十章面向对象设计实例教材:机械工业出版社教材:机械工业出版社/刘振安刘振安359359

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号