C++程序设计(4737)刘振安ppt课件_第1页
C++程序设计(4737)刘振安ppt课件_第2页
C++程序设计(4737)刘振安ppt课件_第3页
C++程序设计(4737)刘振安ppt课件_第4页
C++程序设计(4737)刘振安ppt课件_第5页
已阅读5页,还剩354页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.,1,4737 C+程序设计,教材:机械工业出版社/刘振安,.,2,需要了解的C语言知识,C语言基本语法 If else 语句 For语句 While语句,数组定义 函数定义 指针 结构体 运算符,.,3,第一章认识C+的对象,本节要点:,C与C+的关系(领会) 掌握函数原型和命名空间的使用方法(综合应用) 对象和预处理基本概念(领会) 掌握C+程序的基本结构(综合应用),1.1初识C+的函数和对象,.,4,第一章认识C+的对象,1.1初识C+的函数和对象,C语言回顾,int x;,该语句在C语言和C+中均可使用,x在C语言中称为变量,在C+中称为对象。 C语言与C+的不同点: 称呼不同,.

2、,5,第一章认识C+的对象,1.1初识C+的函数和对象,C语言回顾,结构体的定义,struct point float x; float y; ;,表示定义一种点数据类型,包含坐标x,y. 定义完成后,point成为一种类型,使用方式类似int类型,如:定义p1变量为点类型,写作: struct point p1; 或 point p1;,定义x变量为整型: int x;,.,6,第一章认识C+的对象,1.1初识C+的函数和对象,C语言回顾,结构体的定义,struct student int num; char name10; float grade; ;,若定义一种结构体记录学生信息包含学号

3、,姓名,成绩,如何定义?,定义s1变量为学生类型,写作: struct student s1;,.,7,第一章认识C+的对象,1.1初识C+的函数和对象,例1.1输入一个点的信息,求该点到原点的距离,预处理命令,使用命名空间,声明函数,声明常量,定义结构体,,主函数main,求距离函数result,.,8,例1.1,.,9,例1.1 主 函 数,.,10,例1.1,.,11,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 1,混合型语言 C语言程序包含main函数 面向对象语言没有main函数 C+是混合型语言,.,12,第一章认识C+的对象,1.1初识C+的函数和对象,对程

4、序的说明: 2,注释方式 /* 。*/ /。,.,13,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 3,输入输出流 cin和cout是C+语言中进行输入输出操作的函数。其定义在isstream头文件中。 类似:C语言中printf函数scanf函数putchar函数getchar函数,使用时要包含“stdio.h”,.,14,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 3,输入输出流 cin和cout函数的简单使用 cout后加要输出的内容,可以是对象或字符串,行末加分号,可用多个来分隔多个输出对象,endl;表示输出后换行。 coutendl; 等

5、价于 cout“n”;,.,15,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 3,输入输出流 cin和cout函数的简单使用 cin后加存放数据的对象,即变量,行末加分号,可用多个来分隔多个输入对象。 cinxy;等价于 cinx;ciny;,.,16,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 4,使用命名空间 是C+语言中封装程序库名称的一种机制 记忆: C+标准类库中的对象和函数都属于std命名空间 使用这些对象和函数时要using namespace std,.,17,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 4,使用

6、命名空间 使用std命名空间时注意: 使用C语言中的头文件时,要写成“xxx.h”形式 使用C+中的头文件则不能加上“.h”,.,18,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 5,对象定义及初始化 int x;x=0;等价于 int x=0; C语言 int x(0); C+语言等价于上两条语句。 此种初始化语法在C+中称为构造函数语法,.,19,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 6,函数原型及其返回值 函数要有类型,若要得到处理结果则要使用return语句。,.,20,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明:

7、6,函数原型及其返回值 函数原型声明 函数调用在函数定义之前时要对函数进行声明,.,21,.,22,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 7,const修饰符和预处理程序 常量定义:#define PI 3.1415 (c语言) 在变量定义之前加上const关键字,表示定义的变量值不可改变。 const int PI=3.1415; const int PI(3.1415);,.,23,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 7,const修饰符和预处理程序 常量定义:#define PI 3.1415 #define命令的特点: 原样替换

8、掉程序中出现的预定义宏名符号 如:#define BUFFER 100 若程序出现:x=BUFFER/3;x=? 尽量选择const定义常量,.,24,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 7,const修饰符和预处理程序 const关键字的特点: 利用const定义常量时必须给出常量的值,除非该常量是extern的。 如:const int d; extern const ;,作业:1,extern变量是什么样的变量?,.,25,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 7,const修饰符和预处理程序 C+预处理命令 以#开始,分为宏定义

9、,文件包含和条件编译,作业: 2,写出C语言中预处理命令有哪些,举例说明每个命令含义及作用。 3,写出C语言和C+语言中#include命令的不同处,.,26,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 8,程序运行结果,.,27,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 9,程序书写规则 注意缩进对齐,使程序清晰明了,.,28,1.2认识C+语言面向过程编程的特点,本节要点:,函数重载(领会) 掌握C+的新数据类型(简单应用) 动态分配内存(综合应用) 熟练掌握引用的使用方法(综合应用) 了解对指针使用const限定符的目的,方法(识记) 了解泛

10、型算法应用于普通数组的方法(识记) 掌握数据的简单输入输出(简单应用),.,29,第一章认识C+的对象,1.2认识C+语言面向过程编程的特点,本节要点:,1.2.1函数重载(领会) C+允许一个函数定义多个版本。 使得一个函数完成多种功能。 即:同一个函数名定义多次。,.,30,1.2.1函数重载(领会) 重载函数max的调用形式:,.,31,1.2.1函数重载(领会) 重载函数max的定义形式:,.,32,1.2.1函数重载(领会) 重载函数max的声明形式:,可否不声明?,重载函数的要点: 函数名相同,参数个数不同,参数类型不同,.,33,1.2.2 C+的新数据类型(简单应用),1,vo

11、id类型 void表示无类型,或空类型。 不能声明变量,只能声明函数返回值。 表示函数无返回值。,.,34,2,bool型 (逻辑型,布尔型) 占1个字节。表示逻辑运算中的” 真” ” 假” 3,整型(int long short) int 、short 至少16位 long 至少32位 short 不得比int 长 int 不得比long 长,.,35,4,char型 (字符型) 占1个字节。 5,实型(float/double/long double),.,36,5,,.,37,6,常量表示 整型: 0前缀表示8进制数,0 x前缀表示16进制 加L、l后缀表示长整型常量 实型: F、f后缀

12、表示浮点型常量(float) 实数加L、l后缀表示long double型 无前缀,无后缀的为double型,.,38,6,常量表示,0L 123l 05 5 0 x5 0 xaf 01,7,转义字符,101 t r n 0 x41,.,39,1.2.3 动态分配内存(综合应用) new 动态分配内存 一般格式: 指针变量=new 类型size; new 运算符得到新分配空间的首地址,赋值给指针变量后,可根据指针变量的加减运算来使用这些空间。 delete 释放内存 使用完毕后要释放内存 delete p;,.,40,1.2.4 引用的使用方法(综合应用) C+中新的表示形式。 引用即使用变量

13、的别名。 定义形式:数据类型 表示a是变量x的别名。 一旦定义别名后则a和x完全等价。,.,41,1.2.4 引用的使用方法(综合应用) C+中新的表示形式。 引用即使用变量的别名。 定义形式:数据类型 表示a是变量x的别名。 一旦定义别名后则a和x完全等价。,.,42,1.2.4 引用的使用方法(综合应用) C+中新的表示形式。 引用即使用变量的别名。 定义形式:数据类型 则 long int i ; 等价于 lint i ;,用法总结:建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头,.,45,引用数组名作参数,一般格式:

14、typedef 类型 类型别名 使用typedef定义某类型别名后,可使用该别名来定义相关对象。 例如:typedef long int lint; 则 long int i ; 等价于 lint i ;,.,46,Typedef使用说明,typedef用法总结:建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头,等价于,.,47,1.2.5 对指针使用const限定符(识记),1,左值和右值 表达式:E1=E2E1是左值,是可被修改的 int *p,x=1; *p=2; const int *P; const int *P=

15、表示*P是不可改变的。*P不能在=左侧。 P= int * const P ; 错!必须初始化 int * const P = const int * const P = void Setxy(double a, double b) x=a; y=b; void Display() cout xtyendl; ;,.,61,第二章从结构到类的演变,1. 函数与数据共存结构的定义,struct point double x,y; void Setxy(double a, double b) x=a; y=b; void Display() cout xtyendl; ;,数据成员,成员函数,.,

16、62,第二章从结构到类的演变,1. 函数与数据共存结构的定义,.,63,第二章从结构到类的演变,运行结果,.,64,第二章从结构到类的演变,主函数,.,65,完整程序,.,66,修 改 后 的 程 序,.,67,第二章从结构到类的演变,2 封装 若定义结构体时,使用了private关键字,则产生封装性,.,68,使 用 了private关 键 字, 则 产 生 封装性,.,69,第二章从结构到类的演变,2 封装 在定义结构时,若使用了private则产生封装性,表示成员为私有的,只能在结构体内部通过公有成员函数使用。若未添加private则表示默认为public。 类定义时默认为private

17、。,.,70,第二章从结构到类的演变,2.1.2 使用构造函数初始化结构的对象 在定义结构时,与结构同名的函数称为构造函数。 若定义的函数与某个已定义函数重名而参数类型或个数不同,则称为函数重载。,.,71,2.1.2 使用构造函数初始化结构的对象,问题:那个函数是构造函数?那个函数被重载了?,结构体的定义,.,72,2.1.2 使用构造函数初始化结构的对象,注:构造函数在定义结构体对象时自动执行, 并根据是否初始化来自动选择所调用的构造函数,.,73,2.1.2 使用构造函数初始化结构的对象,.,74,2.1.2 使用构造函数初始化结构的对象,.,75,第二章从结构到类的演变,2.2从结构演

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

19、向过程 的求解步骤 给出三角形三个顶点坐标,计算三边长,并输出 步骤:输入x1,y1,x2,y2,x3,y3 六个数据 计算(x1,y1)和(x2,y2)距离 计算(x1,y1)和(x3,y3)距离 计算(x2,y2)和(x3,y3)距离 输出三个距离,.,82,第二章从结构到类的演变,面向对象 的求解步骤 给出三角形三个顶点坐标,计算三边长,并输出,设计类 将点设计为一个类,并提供 相关的属性和操作,.,83,第二章从结构到类的演变,面向对象 的求解步骤 给出三角形三个顶点坐标,计算三边长,并输出,定义对象同时给出坐标 point A(x1,y1) point B(x2,y2) point

20、C(x3,y3),.,84,第二章从结构到类的演变,面向对象 的求解步骤 给出三角形三个顶点坐标,计算三边长,并输出,定义对象,然后获取坐标 point A; point B; point C ; A.Getx();A.Gety(); B.Getx();B.Gety(); C.Getx();C.Gety();,.,85,第二章从结构到类的演变,面向对象 的求解步骤 给出三角形三个顶点坐标,计算三边长,并输出,计算距离并输出 AB=A.GetLength(B); AC=A.GetLength(C); BC=B.GetLength(C);,.,86,第二章从结构到类的演变,2.4C+面向对象程序设

21、计特点,2.4.1 对象 三要素:对象名,属性,操作,.,87,第二章从结构到类的演变,2.4C+面向对象程序设计特点,2.4.1 对象 三要素:对象名,属性,操作,.,88,第二章从结构到类的演变,2.5使用类和对象,2.5.1使用string对象,类名,类的属性用于存放字符串,类的操作/方法/成员函数,.,89,第二章从结构到类的演变,2.5使用类和对象,2.5.1使用string对象,该类是C+语言中的内部预定义类,要在程序中使用该类时必须添加头文件 #inculude,.,90,第二章从结构到类的演变,2.5使用类和对象,2.5.1使用string对象,类的初始化:string str

22、1 =“A”; string str1 =A; string str1 =AB; string str1 =“AB”; 可以以数组的形式使用str1对象中的字符串 str10的值是? str11的值是?,.,91,2.5.1使用string对象,类的初始化:string str1 (“hello,”); string str2 =“world”; 可以以数组的形式使用str1对象中的字符串 str10的值是? str20的值是?,.,92,2.5.1使用string对象,.,93,2.5.1使用string对象,运行结果,.,94,2.5.1使用string对象,string对象允许使用 +

23、运算,.,95,2.5.1使用string对象 对象的方法(操作/成员函数): 对象名.成员函数 str1.size() String对象可使用+运算 Str1=str2+str3 若str2=“hello,” str3=“everyone” 则str1的结果是?,.,96,2.5.2使用string对象的成员函数 成员函数使用格式:对象名.成员函数 例如:str1.size() 若Str1=“everyone!” Str1.size()值为:9,.,97,2.5.2使用string对象的成员函数 成员函数使用格式:对象名.成员函数 例如:str1.substr() 若Str1=“everyo

24、ne” Str1.substr(5,3)值为:“one”,C+中字符串中字符位置计数从0开始,.,98,2.5.2使用string对象的成员函数 成员函数使用格式:对象名.成员函数 例如:str1.substr(),C+中字符串中字符位置计数从0开始,.,99,2.5.2使用string对象的成员函数 成员函数使用格式:对象名.成员函数 例如:str1.find(要查找的字符串,开始位置) 结果为子串的位置,C+中字符串中字符位置计数从0开始,.,100,2.5.2使用string对象的成员函数 getline函数的使用 功能:利用cin函数输入一行字符串存入对象 例如:getline(cin

25、,str1,n),.,101,2.5.2使用string对象的成员函数 getline函数的使用 功能:利用cin函数输入一行字符串存入对象 例如:getline(cin,str1,n),.,102,简单应用:日期格式转换,.,103,2.5.3使用complex对象 complex类用于定义一个复数对象 使用时添加头文件#include 定义格式:complex num1(1,2);,.,104,2.5.4使用对象小结 使用标准类库中的类时,须添加头文件。 使用string对象添加?头文件?,添加头文件 #include 并使用标准命名空间 using namespace std;,.,10

26、5,2.5.4使用对象小结 使用标准类库中的类时,须添加头文件。 定义对象方式同变量定义方式。 定义对象时可对对象进行初始化。 int i; string str1; 定义时初始化: int i=1; 或 int i(1); string str1=“hello”; 或 string str1(“hello”);,.,106,2.5.4使用对象小结 使用标准类库中的类时,须添加头文件。 定义对象方式同变量定义方式。 同类的不同对象由对象名和属性来区分。具有相同的成员函数。 string str1=“hello”; string str2(“everyone”); Cout str1.size(

27、)endl; Cout str2.size()endl;,.,107,2.5.4使用对象小结 不同类对象具有不同的成员函数可实现不同操作。 Complex num1(1,2); String str1(“hello”); Coutnum1.real()endl; Coutstr1.sizeendl; Coutstr1endl; coutnum1endl;,.,108,2.5.4使用对象小结 使用标准类库中的类时,须添加头文件。 定义对象方式同变量定义方式。 定义对象时可对对象进行初始化。 同类的不同对象由对象属性来区分。 不同类对象具有不同的成员函数可实现不同操作。 类是具有相同特征和操作的对

28、象的抽象。,.,109,2.6string对象数组与泛型算法,.,110,第三章函数和函数模版,3.1函数的参数及其传递方式,C语言中参数传递方式只有一种:值传递 值传递分为:变量值传递和变量地址值传递 C+中分为:值传递和地址传递(引用传递),.,111,3.1函数的参数及其传递方式,1,2,1,2,.,112,3.1函数的参数及其传递方式,1,2,b,a,2000,2002,2000,2002,.,113,3.1函数的参数及其传递方式,要注意区分: 参数传递中传地址和传地址值不同。 设计函数时要注意: 对象作参数,对象指针作参数,对象引用作参数,.,114,3.1函数的参数及其传递方式,3

29、.1.1对象作函数参数 作用同C语言中普通变量作参数,.,115,3.1函数的参数及其传递方式,3.1.2对象指针作函数参数 作用同C语言中变量指针作参数,.,116,3.1函数的参数及其传递方式,3.1.3引用作为函数参数 引用的声明形式: 数据类型 则a为x变量(对象)的引用,a和x对应同一个内存空间。a未单独分配内存。b为a的引用。,.,117,3.1函数的参数及其传递方式,3.1.3引用作为函数参数 引用的声明形式: 数据类型 b=10; 则a为x变量(对象)的引用,a和x对应同一个内存空间。a未单独分配内存。b为a的引用。 程序中引用对象的改变会使得被引用对象发生改变。,.,118,

30、3.1函数的参数及其传递方式,3.1.3引用作为函数参数 引用作函数参数: 类型 函数名(类型 则 long int i ; 等价于 lint i ;,.,124,Typedef使用说明,typedef用法总结:建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头,等价于,.,125,3.1函数的参数及其传递方式,3.1.4默认参数 函数调用时,可以为函数指定实参,也可不指定实参,未指定实参时,函数自动取默认值。,.,126,3.1函数的参数及其传递方式,3.1.4默认参数 函数调用时,可以为函数指定实参,也可不指定实参,未指定实

31、参时,函数自动取默认值。 注意: 若函数第n个参数是默认参数,当调用函数需要指定该参数值时,则该参数前的所有参数都必须指定。,.,127,3.1函数的参数及其传递方式,3.1.5使用const保护数据 const限定参数值不可修改。,.,128,3.2深入讨论函数的返回值,.,129,3.2深入讨论函数的返回值,3.2.1返回引用的函数,.,130,3.2深入讨论函数的返回值,3.2.2返回指针的函数,.,131,3.2深入讨论函数的返回值,3.2.2返回指针的函数,.,132,3.2深入讨论函数的返回值,3.2.3返回对象的函数,.,133,3.2深入讨论函数的返回值,3.2.2返回指针的函

32、数补充 说明:new语句 delete语句 NULL New格式: 指针变量 = new 类型n Delete格式: delete 指针变量 NULL表示空,.,134,3.2深入讨论函数的返回值,.,135,3.2深入讨论函数的返回值,3.2.3返回对象的函数,.,136,3.2深入讨论函数的返回值,3.2.4返回值作为函数参数,.,137,3.3内联函数,.,138,定义函数时,加inline关键字表示该函数为内联函数。,3.3内联函数,.,139,定义函数时,加inline关键字表示该函数为内联函数。 程序中的内联函数在程序编译时,将函数体替换至程序中函数调用位置,造成程序变长,效率提高

33、。 注意:内联函数中不能出现循环、switch语句 内联函数一般短小,不宜过长 应在调用之前声明或定义,3.3内联函数,.,140,3.4函数重载和默认参数,同一个函数名实现多种功能,在C+中称为多态,可利用函数重载和默认参数两种方式实现,.,141,3.4函数重载和默认参数,同一个函数名实现多种功能,在C+中称为多态,可利用函数重载和默认参数两种方式实现,定义或声明函数时,给出参数初始化值,则函数调用时若省略参数,则参数取该初始化值。称为默认参数。,.,142,3.4函数重载和默认参数,同一个函数名实现多种功能,在C+中称为多态,可利用函数重载和默认参数两种方式实现 注意: 函数重载和默认参

34、数可同时使用。 若已定义默认参数函数,则不能重载参数类型相同,参数个数少于默认参数个数的函数。,.,143,3.4函数重载和默认参数,同一个函数名实现多种功能,在C+中称为多态,可利用函数重载和默认参数两种方式实现 注意: 函数重载和默认参数可同时使用。 若已定义默认参数函数,则不能重载参数类型相同,参数个数少于默认参数个数的函数。参数类型不同时,可以重载。,.,144,3.5函数模板,有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。,.,145,3.5函数模板,有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。,.,146

35、,3.5函数模板,有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。,.,147,3.5函数模板,函数模板定义格式:,定义函数模板后,函数调用时根据函数参数来类型来确定调用哪个版本的函数。函数执行时确定参数类型的函数称为模板函数。,.,148,3.5函数模板,此种形式调用中称为函数模板的参数 一般可省略。Typename可替代class,.,149,3.5函数模板,若某函数参数类型不一致时,也可定义函数模板。,.,150,第四章类和对象,4.1类及其实例化,4.1.1类的定义,.,151,.,152,:称为域限定符,表示函数是类的成员函数。此时函数若要定义为内

36、联,则加inline关键字,类内定义的函数默认为内联函数。,.,153,注意:类定义时,数据成员的赋值必须写在某个函数的内部。一般使用类似set的函数进行赋值。 S1.set(1001,张三,22,99.5) 类student的set函数应该怎么定义?,.,154,4.1类及其实例化,4.1.2使用类的对象 类的对象的使用类似变量的使用。,声明/定义对象,直接利用对象名使用,通过对对象的引用使用对象,通过指向对象的指针使用对象,.,155,4.1.2使用类的对象 类的对象的使用类似变量的使用。 在main函数中是否可按如下方式使用?,.,156,4.1.2使用类的对象 数据成员使用规律: 1,

37、类的成员函数可以直接使用类的数据成员 2,类外的函数不能使用类的私有成员 3,类外的函数可以访问类的公有成员函数 4,对象间的区别在于其属性值不同,.,157,4.1.3数据封装 对象间利用公有成员函数进行通信。 公用成员函数是对象的接口。,.,158,4.2构造函数 4.2.1默认构造函数 若类的定义中未定义构造函数,则C+编译器会自动产生一个不带参数的默认构造函数,类似于:point(),此时不对对象进行初始化。 若类中定义了构造函数,则不再产生默认构造函数。,.,159,4.2.2定义构造函数 构造函数无返回值,这样可以减少编译器的工作,提高效率。 构造函数与类同名。 构造函数可以重载。

38、 构造函数系统自动调用。,.,160,4.2.2定义构造函数,初始化列表,初始化列表,.,161,4.2.3 构造函数和运算符new,New和构造函数一同起作用,即new首先给对象分配内存,然后自动调用构造函数来初始化这块内存。,注意:new建立的动态对象只能用delete删除,一边释放空间。,.,162,4.2.4构造函数的默认参数,这是错误的,因为Point()比有默认参数的函数少。,.,163,4.2.5复制构造函数 :(const,Point(Point p-show();,.,200,5.5数组和类 定义对象的指针数组 int *p;表示定义一个指针变量 int p5;表示定义一个数

39、组。 int *p5 表示定义一个数组中有5个元素,每个元素是一个指针。 此类数组称为指针数组。 point *p; p=new point; p=new point(1,2);,.,201,5.5数组和类 定义对象的指针数组 point *p3; p0=new point(1,2); p1=new point(3,4); p2=new point(5,6); 通过p0使用p0指向的对象。 p0-show(); 可通过循环使用pi指向的对象。,.,202,5.5数组和类 定义指向对象的指针数组,并初始化。 point *p3=new point(1,2), new point(3,4), ne

40、w point(5,6) ;,.,203,5.6指向成员函数的指针 函数被调用时需要调入内存 函数有地址:存放函数的内存单元的首地址 指针可以存放地址 存放函数地址的指针称为指向函数的指针 定义形式:类型 (*指针名)(参数类型);,.,204,5.6指向成员函数的指针 int max(int a,int b) return ab?a:b; void main() int (*p)(int ,int ); p=max; (*p)(1,2); ,.,205,5.6指向成员函数的指针 若max函数是某类A的成员函数则: int A : max(int a,int b) return ab?a:b;

41、 void main() int (A : *p)(int ,int ); A a; p=A : max; a.(*p)(1,2); ,.,206,5.7求解一元二次方程 利用C实现 设计类,定义类, 定义main函数 定义对象, 利用对象调用成员函数 执行,.,207,设计类 类的对象中应能存放相关数据:具有数据成员 a,b,c一元二次方程的三个系数 x1,x2存放求得的方程解 delta存放b*b-4*a*c 类的对象应能完成计算功能:具有成员函数 1,将数据存入数据成员的函数 2,显示结果的函数 3,计算x1,x2的函数,.,208,定义类,.,209,设计类,定义类的成员函数,.,21

42、0,main函数,.,211,main函数,.,212,main函数,.,213,main函数,.,214,main函数,.,215,第五章复习,构造函数定义: class A int a public: A(int x):a(x) A(int x)a=x; ,const限定的数据成员初始化必须用?形式? 还有什么数据成员必须用此种形式初始化?,const限定的数据成员和引用数据成员初始化必须使用初始化列表形式。,.,216,静态成员 不依赖于对象而存在。 静态数据成员:定义时加static 静态成员必须初始化 使用语句:int A:b=0; 静态对象: static对象一旦定义存在于内存中,

43、直到程序结束才释放内存。,.,217,静态成员 不依赖于对象而存在。 静态成员使用注意: 非静态对象 静态成员 可否使用? 静态对象 静态成员 可否使用? 静态对象 非静态成员 可否使用? 静态成员函数 非静态成员 可否使用? 非静态成员函数 静态成员 可否使用?,.,218,静态成员 不依赖于对象而存在。 其他注意事项: p108 1-7 静态函数没有this指针 不能声明为virtual函数,.,219,友元 普通函数作友元 类的成员函数作友元 类作友元 类A的友元(函数,成员函数,类)可以访问类A中的所有成员,但必须通过对象或引用来访问。 友元应在类A中利用friend声明,.,220,

44、const对象 const数据成员 const成员函数 const指针 const变量 const引用 加const限定后不可改变,任何企图改变都导致错误,并应注意他们的初始化!,.,221,使用规则: const对象 不能调用任何非const成员函数 const成员函数只能调用const成员函数 非const对象可以调用const成员函数 非const对象可以使用const数据成员 const成员函数中不能使用任何试图改变变量值的语句。,.,222,数组和类 类可以定义对象 类可以定义对象数组 对象数组中的每个元素都是对象,其使用方式和对象的使用方式相同。 对象数组名表示数组的首地址 可以定

45、义指向对象的指针p使其指向某个对象 可以用指针p指向数组中的元素,.,223,对象的指针数组使用 函数指针定义形式: int (*p)(int,int); int (A:*P)(int,int); int max(int a,int b) int A:max(int a,int b) ,.,224,习题五-1,.,225,习题五-1,.,226,习题五-1,.,227,习题五-1,.,228,习题五-1,.,229,习题五-4,.,230,习题五-4,.,231,第六章继承和派生,6.1继承和派生的基本概念 继承关系是类与类之间的类属关系 类:人 类:学生 类:教师 在已有类的基础上定义新的类

46、称为类的派生,新产生的类为派生类,原来的类为基类。 (一般与特殊的关系),.,232,6.1继承和派生的基本概念 继承关系是类与类之间的类属关系 类:人 类:学生 类:教师 从成员构成来看,派生类具有基类的所有成员,基类又叫父类,派生类又叫子类。,.,233,6.1继承和派生的基本概念 类的继承是指:派生类继承基类的所有数据成员和成员函数。用于表示类间的类属关系。非构成关系。 派生类的特点: 1,增加新成员。 2,重定义已有成员函数。 3,改变基类的成员的访问权限。,.,234,6.1继承和派生的基本概念,人,学生,教师,姓名、年龄、性别。,.,235,6.2单一继承,6.2.1一般形式 cl

47、ass 派生类名:访问控制 基类名 private: 成员列表; public: 成员列表; protected: 成员列表; ;,.,236,6.2单一继承,6.2.2派生类的构造函数和析构函数 派生类中继承的基类的成员初始化时,需要由派生类的构造函数调用基类的构造函数。 派生类的构造函数一般形式: 派生类名:派生类名(参数):基类名(参数) /函数体 构造函数和析构函数不能被继承。,.,237,6.2单一继承,类的派生实例 有类human对象用于存放人的相关信息:姓名,年龄,性别 并能利用成员函数实现相关信息输出。 在此基础上定义类student类,具有学号、班级信息, 并能完成信息的输出

48、显示。 定义类,并设计测试程序。,.,238,6.2.2派生类的构造函数和析构函数,.,239,6.2.2派生类的构造函数和析构函数,.,240,6.2.2派生类的构造函数和析构函数,.,241,6.2.2派生类的构造函数和析构函数 运行结果:,问题:在student类中能否直接使用human类中的name,sex,age等成员?,.,242,6.2.2派生类的构造函数和析构函数,此时程序无法运行!,.,243,6.2.2派生类的构造函数和析构函数,类A定义中由private限定的成员只能在类A中使用。 student虽然是human的派生类也不可使用human类中的private成员,所以在

49、student中定义的show函数不可使用human中的name,sex,age等私有成员。,.,244,6.2.3类的保护成员protected,公有派生得到的派生类不能使用基类的私有成员。 那么如何解决派生类中访问基类的成员呢?并且不能打破封装性:基类的对象仍不可使用这些成员。,.,245,6.2.3类的保护成员protected,公有派生得到的派生类不能使用基类的私有成员。 protected限定的成员具有公有和私有双重性质 该类成员在派生类中可访问,其他非成员函数不可访问。,.,246,6.2.3类的保护成员protected,.,247,6.2.3类的保护成员protected,.,

50、248,6.2.3类的保护成员protected,.,249,6.2.3类的保护成员protected,公有派生得到的派生类不能使用基类的私有成员。 protected限定的成员具有公有和私有双重性质 该类成员在派生类中可访问,其他函数不可访问。,.,250,复习上节,基类、派生类、继承 派生类的特点: 1,增加新成员 2,重定义已有函数 3,改变成员访问权限,.,251,复习上节,派生类的定义形式:,class 派生类名:访问控制 基类名 private: 成员列表; public: 成员列表; protected: 成员列表; ;,.,252,复习上节,派生类的定义形式:,公有派生的特点:

51、 派生类中可访问基类中的protected成员 派生类中可访问基类中的public成员 派生类中不可访问基类中的private成员,.,253,复习上节,公有派生和保护成员,protected限定的成员具有公有和私有双重性质 在基类中是私有的,在派生类中可访问。 问题: 1,基类的对象是否可访问protected成员? 2,派生类的对象是否可访问公有派生类中继承自基类的protected成员? 3,基类的成员函数是否可访问基类中的protected成员? 4,派生类的成员函数是否可访问公有派生类中继承自基类的protected成员?,.,254,复习上节,派生类的构造函数和析构函数:,派生类的

52、构造函数不能由基类继承而得 派生类的构造函数一般形式: 派生类名:派生类名(参数):基类名(参数) /函数体 ,.,255,复习上节,派生类的构造函数和析构函数:,当产生一个派生类对象时,首先调用基类的构造函数,然后调用派生类的构造函数。 当释放一个派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。,.,256,6.2.3类的保护成员protected,.,257,6.2.4访问权限,1,公有派生和赋值兼容规则 a,基类的公有成员在派生类中仍是公有的。 b,基类的保护成员在派生类中仍是保护的。 c,基类的私有成员在派生类中是不可访问的。 d,基类的不可访问成员在派生类中仍不可访问

53、。,什么是类的不可访问成员? 例如:若human类中name是private的, 则,student类不可访问 若student做某个类A的基类时,类A仍不可访问name,.,258,6.2.4赋值兼容规则,基类对象和派生类对象的相互赋值。,每个学生都是人。 说明:student类的每个对象都是human类的对象。 每个人不一定是学生。 说明:human类的每个对象不一定是student类的对象。,.,259,6.2.4赋值兼容规则,基类对象和派生类对象的相互赋值。,每个学生都是人。 说明:student类的每个对象都是human类的对象。 a,派生类的对象可赋值给基类的对象。 b,派生类的对

54、象可以初始化基类的引用 c,派生类的对象地址可赋值给基类的指针 此时基类的引用或指针只能访问派生类中继承自基类的成员。,.,260,6.2.4赋值兼容规则,a,派生类的对象可赋值给基类的对象。 b,派生类的对象可以初始化基类的引用 c,派生类的对象地址可赋值给基类的指针 此时基类的对象、引用或指针只能访问派生类中继承自原基类的成员。,ph-show();,.,261,6.2.4 isa和has-a的区别,类与类间的关系: isa关系: 继承和派生关系。 has-a关系: 一个类使用另一个类的对象作成员 一般来说:公有继承关系和isa关系是等价的。 但某些情况下: 企鹅是鸟 鸟会飞 企鹅会飞吗?

55、 对象作成员表示has-a关系,.,262,6.2.4 公有继承存取权限表 什么是公有继承?,基类,派生类,基类对象,派生类对象,private public protected,不可访问 public protected,不可访问 可访问 不可访问,不可访问 可访问 不可访问,.,263,6.2.4 私有派生 定义派生类时,用private限定,class 派生类名:private 基类名 private: 成员列表; public: 成员列表; protected: 成员列表; ;,.,264,6.2.4 私有派生 定义派生类时,用private限定,基类的私有成员和不可访问成员在派生类中

56、不可访问 基类的公有成员和保护成员变为私有成员,.,265,6.2.4 私有派生 假定有基类:base,.,266,6.2.4 私有派生 定义派生类时,用private限定,问题:,.,267,6.2.4 私有派生 定义派生类时,用private限定,问题:d对象是否可以使用fun1函数?,.,268,6.2.4 私有派生 定义派生类时,用private限定,基类的私有成员和不可访问成员在派生类中不可访问 基类的公有成员和保护成员变为私有成员,派生类的对象不可访问继承自基类的所有成员,派生类的成员函数可访问继承自基类的protected成员和public成员,.,269,6.2.4 保护派生

57、定义派生类时,用protected限定,降级使用 基类中的private变为不可访问 protect变为private public 变为protected,.,270,.,271,降级使用 基类中的private变为不可访问 protected变为private public 变为protected,.,272,6.3多重继承 一般形式:,class 类1:访问控制 类2, 访问控制 类3 private: /私有成员 protected: /保护成员 public: /公有成员 ,.,273,.,274,多重继承中成员访问权限的变化同单一继承! 以下访问是指在派生类的成员函数中使用成员 公

58、有派生: 基类的private成员在派生类中可否访问? 基类的protected成员在派生类中可否访问? 基类的public成员在派生类中可否访问? 私有派生: 基类的private成员在派生类中可否访问? 基类的protected成员在派生类中可否访问? 基类的public成员在派生类中可否访问?,.,275,多重继承中成员访问权限的变化同单一继承! 保护派生: 基类的private成员在派生类中可否访问? 基类的protected成员在派生类中可否访问? 基类的public成员在派生类中可否访问?,.,276,6.4二义性及其支配规则,6.4.1作用域和成员名限定,.,277,6.4二义性及其支配规则,6.4.1作用域和成员名限定,.,278,6.4二义性及其支配规则,6.4.1作用域和成员名限定,.,279,6.4二义性及其支配规则,6.4.1作用域和成员名限定,当派生类中从多个基类中继承得到同名函数时,在派生类中使用这些函数时,须使用类名限定! 派生类的对象使用这些函数时,也需要进行类名限定!,类名:成员名,.,280,6.4二义性及其支配规则,6.4.2派生类支配基类的同名函数,.,281,6.4.2派生类支配基类的同名函数,C+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论