C++程序设计自学考试国考.ppt

上传人:za****8 文档编号:15798703 上传时间:2020-09-06 格式:PPT 页数:334 大小:2.08MB
返回 下载 相关 举报
C++程序设计自学考试国考.ppt_第1页
第1页 / 共334页
C++程序设计自学考试国考.ppt_第2页
第2页 / 共334页
C++程序设计自学考试国考.ppt_第3页
第3页 / 共334页
点击查看更多>>
资源描述
1,4737 C+程序设计,郝慎学,电子信箱:H,教材:机械工业出版社/刘振安,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+的不同点: 称呼不同,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; ;,若定义一种结构体记录学生信息包含学号,姓名,成绩,如何定义?,定义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+的函数和对象,对程序的说明: 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; 等价于 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,使用命名空间 使用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+的函数和对象,对程序的说明: 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命令的特点: 原样替换掉程序中出现的预定义宏名符号 如:#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+预处理命令 以#开始,分为宏定义,文件包含和条件编译,作业: 2,写出C语言中预处理命令有哪些,举例说明每个命令含义及作用。 3,写出C语言和C+语言中#include命令的不同处,26,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 8,程序运行结果,27,第一章认识C+的对象,1.1初识C+的函数和对象,对程序的说明: 9,程序书写规则 注意缩进对齐,使程序清晰明了,28,1.2认识C+语言面向过程编程的特点,本节要点:,函数重载(领会) 掌握C+的新数据类型(简单应用) 动态分配内存(综合应用) 熟练掌握引用的使用方法(综合应用) 了解对指针使用const限定符的目的,方法(识记) 了解泛型算法应用于普通数组的方法(识记) 掌握数据的简单输入输出(简单应用),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,void类型 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后缀表示浮点型常量(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+中新的表示形式。 引用即使用变量的别名。 定义形式:数据类型 表示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,引用数组名作参数,一般格式: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= 表示*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; ;,数据成员,成员函数,62,第二章从结构到类的演变,1. 函数与数据共存结构的定义,63,第二章从结构到类的演变,运行结果,64,第二章从结构到类的演变,主函数,65,完整程序,66,修 改 后 的 程 序,67,第二章从结构到类的演变,2 封装 若定义结构体时,使用了private关键字,则产生封装性,68,使 用 了private关 键 字, 则 产 生 封装性,69,第二章从结构到类的演变,2 封装 在定义结构时,若使用了private则产生封装性,表示成员为私有的,只能在结构体内部通过公有成员函数使用。若未添加private则表示默认为public。 类定义时默认为private。,70,第二章从结构到类的演变,2.1.2 使用构造函数初始化结构的对象 在定义结构时,与结构同名的函数称为构造函数。 若定义的函数与某个已定义函数重名而参数类型或个数不同,则称为函数重载。,71,2.1.2 使用构造函数初始化结构的对象,问题:那个函数是构造函数?那个函数被重载了?,结构体的定义,72,2.1.2 使用构造函数初始化结构的对象,注:构造函数在定义结构体对象时自动执行, 并根据是否初始化来自动选择所调用的构造函数,73,2.1.2 使用构造函数初始化结构的对象,74,2.1.2 使用构造函数初始化结构的对象,75,第二章从结构到类的演变,2.2从结构演化成一个简单的类,将程序中struct替换为class即变为类的标准定义形式,76,第二章从结构到类的演变,2.2从结构演化成一个简单的类,产生类对象p1,p2,为对象的属性赋值,显示对象属性值,77,第二章从结构到类的演变,2.2从结构演化成一个简单的类,类图的表示,类名,类属性 /成员变量,类操作 /成员函数,78,第二章从结构到类的演变,2.3面向过程和面向对象,简单了解对象的含义,79,第二章从结构到类的演变,2.3面向过程和面向对象,简单了解对象的含义,80,第二章从结构到类的演变,2.3面向过程和面向对象,简单了解对象的含义,81,第二章从结构到类的演变,面向过程 的求解步骤 给出三角形三个顶点坐标,计算三边长,并输出 步骤:输入x1,y1,x2,y2,x3,y3 六个数据 计算(x1,y1)和(x2,y2)距离 计算(x1,y1)和(x2,y2)距离 计算(x1,y1)和(x2,y2)距离 输出三个距离,82,第二章从结构到类的演变,面向对象 的求解步骤 给出三角形三个顶点坐标,计算三边长,并输出,设计类 将点设计为一个类,并提供 相关的属性和操作,83,第二章从结构到类的演变,面向对象 的求解步骤 给出三角形三个顶点坐标,计算三边长,并输出,定义对象同时给出坐标 point A(x1,y1) point B(x2,y2) point 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+面向对象程序设计特点,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 str1 =“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对象允许使用 + 运算,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=“everyone” Str1.substr(3,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,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;,105,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()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使用对象小结 使用标准类库中的类时,须添加头文件。 定义对象方式同变量定义方式。 定义对象时可对对象进行初始化。 同类的不同对象由对象属性来区分。 不同类对象具有不同的成员函数可实现不同操作。 类是具有相同特征和操作的对象的抽象。,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.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,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默认参数 函数调用时,可以为函数指定实参,也可不指定实参,未指定实参时,函数自动取默认值。 注意: 若函数第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返回指针的函数补充 说明: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关键字表示该函数为内联函数。 程序中的内联函数在程序编译时,将函数体替换至程序中函数调用位置,造成程序变长,效率提高。 注意:内联函数中不能出现循环、switch语句 内联函数一般短小,不宜过长 应在调用之前声明或定义,3.3内联函数,140,3.4函数重载和默认参数,同一个函数名实现多种功能,在C+中称为多态,可利用函数重载和默认参数两种方式实现,141,3.4函数重载和默认参数,同一个函数名实现多种功能,在C+中称为多态,可利用函数重载和默认参数两种方式实现,定义或声明函数时,给出参数初始化值,则函数调用时若省略参数,则参数取该初始化值。称为默认参数。,142,3.4函数重载和默认参数,同一个函数名实现多种功能,在C+中称为多态,可利用函数重载和默认参数两种方式实现 注意: 函数重载和默认参数可同时使用。 若已定义默认参数函数,则不能重载参数类型相同,参数个数少于默认参数个数的函数。,143,3.4函数重载和默认参数,同一个函数名实现多种功能,在C+中称为多态,可利用函数重载和默认参数两种方式实现 注意: 函数重载和默认参数可同时使用。 若已定义默认参数函数,则不能重载参数类型相同,参数个数少于默认参数个数的函数。参数类型不同时,可以重载。,144,3.5函数模板,有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。,145,3.5函数模板,有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。,146,3.5函数模板,有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。,147,3.5函数模板,函数模板定义格式:,定义函数模板后,函数调用时根据函数参数来类型来确定调用哪个版本的函数。函数执行时确定参数类型的函数称为模板函数。,148,3.5函数模板,此种形式调用中称为函数模板的参数 一般可省略。Typename可替代class,149,3.5函数模板,若某函数参数类型不一致时,也可定义函数模板。,150,第四章类和对象,4.1类及其实例化,4.1.1类的定义,151,152,:称为域限定符,表示函数是类的成员函数。此时函数若要定义为内联,则加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,类的成员函数可以直接使用类的数据成员 2,类外的函数不能使用类的私有成员 3,类外的函数可以访问类的公有成员函数 4,对象间的区别在于其属性值不同,157,4.1.3数据封装 对象间利用公有成员函数进行通信。 公用成员函数是对象的接口。,158,4.2构造函数 4.2.1默认构造函数 若类的定义中未定义构造函数,则C+编译器会自动产生一个不带参数的默认构造函数,类似于:point(),此时不对对象进行初始化。 若类中定义了构造函数,则不再产生默认构造函数。,159,4.2.2定义构造函数,160,4.1.2使用类的对象 类的对象的使用类似变量的使用。,161,第五章特殊函数和成员,5.1对象成员的初始化,类的定义:,162,5.1对象成员的初始化,163,5.1对象成员的初始化,164,5.1对象成员的初始化,165,5.2静态成员 成员定义时使用了static关键字 1,静态成员变量的初始化只能在类外进行。 2,类中的任何成员函数都可访问静态成员变量 3,访问静态成员时,一般加上类名限定。 4,静态成员变量是类的成员,不是对象的成员. 5,对象未建立之前静态成员已经存在。 6,静态成员没有this指针,除非使用引用方式否则不能存取类的成员。,166,5.2静态成员-静态对象,167,5.3友元函数 可以实现两个类之间无限制的存取另一个类的成员。 友元函数可以访问私有成员,公有成员和保护成员。友元函数可以是一个类或函数。友元需通过对象来使用类的成员。 友元的三种形式: 1,普通函数作一个类的友元 2,a类的成员函数作b类的友元 3,a类作为b类的友元,168,5.3友元函数 1,普通函数作一个类的友元 例5.4,169,5.3友元函数 2,a类的成员函数作b类的友元,170,5.3友元函数 2,a类的成员函数作b类的友元,171,5.3友元函数 2,a类的成员函数作b类的友元,172,5.3友元函数 3,a类作b类的友元,173,总结:友元函数 可以实现两个类之间无限制的存取另一个类的成员。 友元函数可以访问私有成员,公有成员和保护成员。友元函数可以是一个类或函数。友元需通过对象来使用类的成员。 友元的三种形式: 1,普通函数作一个类的友元 2,a类的成员函数作b类的友元 3,a类作为b类的友元,174,5.4const对象 const可限定变量、指针、对象、函数、数据成员、成员函数。表示不可改变。 1,const成员 2,const对象 3,const函数 1,const成员 区别于const变量 const变量定义时需要初始化。 const成员在构造函数中初始化 (初始化列表形式),175,5.4const对象 1,const成员 区别于const变量,176,5.4const对象 1,const成员 区别于const变量,177,5.4const对象 2,const引用作参数,178,5.4const对象 2,const对象和const函数 const 对象只能调用const成员函数 const 函数中不允许使用改变变量或成员值的语句,179,复习上节 对象初始化:构造函数两种定义形式。 const限定的数据成员 引用数据成员 静态成员:静态数据成员,静态成员函数 友元:普通函数做友元 类的成员函数做友元 类做友元 const成员:const数据成员(const引用) const成员函数 const对象,180,复习上节 类的对象数组:对象数组中的每个元素都是一 个对象。 对象数组元素的使用同普通对象使用。 对象的指针: 指向对象的指针使用对象的成员函数和数据成员。 对象指针数组:数组中每个元素都是一个指向对象的指针。 指向函数的指针:函数有地址,指针能存地址,指针可以指向函数。,181,5.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)形式构造函数 使用数组中的元素时利用:pointi形式 Pointi的使用同普通对象使用方式相同,182,5.5数组和类 类可定义对象数组,可定义指向对象的指针 数组名是数组在内存中的首地址 指针可以存放地址 可用指针指向数组 通过指针可以使用对象成员p-show() 通过指针可以使用对象数组元素的成员 Pa;a0.show(); p-show();,183,5.5数组和类 定义对象的指针数组 int *p;表示定义一个指针变量 int p5;表示定义一个数组。 int *p5 表示定义一个数组中有5个元素,每个元素是一个指针。 此类数组称为指针数组。 point *p; p=new point; p=new point(1,2);,184,5.5数组和类 定义对象的指针数组 point *p3; p0=new point(1,2); p1=new point(3,4); p2=new point(5,6); 通过p0使用p0指向的对象。 p0-show(); 可通过循环使用pi指向的对象。,185,5.5数组和类 定义指向对象的指针数组,并初始化。 point *p3=new point(1,2), new point(3,4), new point(5,6) ;,186,5.6指向成员函数的指针 函数被调用时需要调入内存 函数有地址:存放函数的内存单元的首地址 指针可以存放地址 存放函数地址的指针称为指向函数的指针 定义形式:类型 (*指针名)(参数类型);,187,5.6指向成员函数的指针 int max(int a,int b) return ab?a:b; void main() int (*p)(int ,int ); p=max; (*p)(1,2); ,188,5.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); ,189,5.7求解一元二次方程 利用C实现 设计类,定义类, 定义main函数 定义对象, 利用对象调用成员函数 执行,190,设计类 类的对象中应能存放相关数据:具有数据成员 a,b,c一元二次方程的三个系数 x1,x2存放求得的方程解 delta存放b*b-4*a*c 类的对象应能完成计算功能:具有成员函数 1,将数据存入数据成员的函数 2,显示结果的函数 3,计算x1,x2的函数,191,定义类,192,设计类,定义类的成员函数,193,main函数,194,main函数,195,main函数,196,main函数,197,main函数,198,第五章复习,构造函数定义: class A int a public: A(int x):a(x) A(int x)a=x; ,const限定的数据成员初始化必须用?形式? 还有什么数据成员必须用此种形式初始化?,const限定的数据成员和引用数据成员初始化必须使用初始化列表形式。,199,静态成员 不依赖于对象而存在。 静态数据成员:定义时加static 静态成员必须初始化 使用语句:int A:b=0; 静态对象: static对象一旦定义存在于内存中,直到程序结束才释放内存。,200,静态成员 不依赖于对象而存在。 静态成员使用注意: 非静态对象 静态成员 可否使用? 静态对象 静态成员 可否使用? 静态对象 非静态成员 可否使用? 静态成员函数 非静态成员 可否使用? 非静态成员函数 静态成员 可否使用?,201,静态成员 不依赖于对象而存在。 其他注意事项: p108 1-7 静态函数没有this指针 不能声明为virtual函数,202,友元 普通函数作友元 类的成员函数作友元 类作友元 类A的友元(函数,成员函数,类)可以访问类A中的所有成员,但必须通过对象或引用来访问。 友元应在类A中利用friend声明,203,const对象 const数据成员 const成员函数 const指针 const变量 const引用 加const限定后不可改变,任何企图改变都导致错误,并应注意他们的初始化!,204,使用规则: const对象 不能调用任何非const成员函数 const成员函数只能调用const成员函数 非const对象可以调用const成员函数 非const对象可以使用const数据成员 const成员函数中不能使用任何试图改变变量值的语句。,205,数组和类 类可以定义对象 类可以定义对象数组 对象数组中的每个元素都是对象,其使用方式和对象的使用方式相同。 对象数组名表示数组的首地址 可以定义指向对象的指针p使其指向某个对象 可以用指针p指向数组中的元素,206,对象的指针数组使用 函数指针定义形式: int (*p)(int,int); int (A:*P)(int,int); int max(int a,int b) int A:max(int a,int b) ,207,习题五-1,208,习题五-1,209,习题五-1,210,习题五-1,211,习题五-1,212,习题五-4,213,习题五-4,214,第六章继承和派生,6.1继承和派生的基本概念 继承关系是类与类之间的类属关系 类:人 类:学生 类:教师 在已有类的基础上定义新的类称为类的派生,新产生的类为派生类,原来的类为基类。 (一般与特殊的关系),215,6.1继承和派生的基本概念 继承关系是类与类之间的类属关系 类:人 类:学生 类:教师 从成员构成来看,派生类具有基类的所有成员,基类又叫父类,派生类又叫子类。,216,6.1继承和派生的基本概念 类的继承是指:派生类继承基类的所有数据成员和成员函数。用于表示类间的类属关系。非构成关系。 派生类的特点: 1,增加新成员。 2,重定义已有成员函数。 3,改变基类的成员的访问权限。,217,6.1继承和派生的基本概念,人,学生,教师,姓名、年龄、性别。,218,6.2单一继承,6.2.1一般形式 class 派生类名:访问控制 基类名 private: 成员列表; public: 成员列表; protected: 成员列表; ;,219,6.2单一继承,6.2.2派生类的构造函数和析构函数 派生类中继承的基类的成员初始化时,需要由派生类的构造函数调用基类的构造函数。 派生类的构造函数一般形式: 派生类名:派生类名(参数):基类名(参数) /函数体 构造函数和析构函数不能被继承。,220,6.2单一继承,类的派生实例 有类human对象用于存放人的相关信息:姓名,年龄,性别 并能利用成员函数实现相关信息输出。 在此基础上定义类student类,具有学号、班级信息, 并能完成信息的输出显示。 定义类,并设计测试程序。,221,6.2.2派生类的构造函数和析构函数,222,6.2.2派生类的构造函数和析构函数,223,6.2.2派生类的构造函数和析构函数,224,6.2.2派生类的构造函数和析构函数 运行结果:,问题:在student类中能否直接使用human类中的name,sex,age等成员?,225,6.2.2派生类的构造函数和析构函数,此时程序无法运行!,226,6.2.2派生类的构造函数和析构函数,类A定义中由private限定的成员只能在类A中使用。 student虽然是human的派生类也不可使用human类中的private成员,所以在student中定义的show函数不可使用human中的name,sex,age等私有成员。,227,6.2.3类的保护成员protected,公有派生得到的派生类不能使用基类的私有成员。 那么如何解决派生类中访问基类的成员呢?并且不能打破封装性:基类的对象仍不可使用这些成员。,228,6.2.3类的保护成员protected,公有派生得到的派生类不能使用基类的私有成员。 protected限定的成员具有公有和私有双重性质 该类成员在派生类中可访问,其他非成员函数不可访问。,229,6.2.3类的保护成员protected,230,6.2.3类的保护成员protected,231,6.2.3类的保护成员protected,232,6.2.3类的保护成员protected,公有派生得到的派生类不能使用基类的私有成员。 protected限定的成员具有公有和私有双重性质 该类成员在派生类中可访问,其他函数不可访问。,233,复习上节,基类、派生类、继承 派生类的特点: 1,增加新成员 2,重定义已有函数 3,改变成员访问权限,234,复习上节,派生类的定义形式:,class 派生类名:访问控制 基类名 private: 成员列表; public: 成员列表; protected: 成员列表; ;,235,复习上节,派生类的定义形式:,公有派生的特点: 派生类中可访问基类中的protected成员 派生类中可访问基类中的public成员 派生类中不可访问基类中的private成员,236,复习上节,公有派生和保护成员,protected限定的成员具有公有和私有双重性质 在基类中是私有的,在派生类中可访问。 问题: 1,基类的对象是否可访问protected成员? 2,派生类的对象是否可访问公有派生类中继承自基类的protected成员? 3,基类的成员函数是否可访问基类中的protected成员? 4,派生类的成员函数是否可访问公有派生类中继承自基类的protected成员?,237,复习上节,派生类的构造函数和析构函数:,派生类的构造函数不能由基类继承而得 派生类的构造函数一般形式: 派生类名:派生类名(参数):基类名(参数) /函数体 ,238,复习上节,派生类的构造函数和析构函数:,当产生一个派生类对象时,首先调用基类的构造函数,然后调用派生类的构造函数。 当释放一个派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。,239,6.2.3类的保护成员protected,240,6.2.4访问权限,1,公有派生和赋值兼容规则 a,基类的公有成员在派生类中仍是公有的。 b,基类的保护成员在派生类中仍是保护的。 c,基类的私有成员在派生类中是不可访问的。 d,基类的不可访问成员在派生类中仍不可访问。,什么是类的不可访问成员? 例如:若human类中name是private的, 则,student类不可访问 若student做某个类A的基类时,类A仍不可访问name,241,6.2.4赋值兼容规则,基类对象和派生类对象的相互赋值。,每个学生都是人。 说明:student类的每个对象都是human类的对象。 每个人不一定是学生。 说明:human类的每个对象不一定是student类的对象。,242,6.2.4赋值兼容规则,基类对象和派生类对象的相互赋值。,每个学生都是人。 说明:student类的每个对象都是human类的对象。 a,派生类的对象可赋值给基类的对象。 b,派生类的对象可以初始化基类的引用 c,派生类的对象地址可赋值给基类的指针 此时基类的引用或指针只能访问派生类中继承自基类的成员。,243,6.2.4赋值兼容规则,a,派生类的对象可赋值给基类的对象。 b,派生类的对象可以初始化基类的引用 c,派生类的对象地址可赋值给基类的指针 此时基类的对象、引用或指针只能访问派生类中继承自原基类的成员。,ph-show();,244,6.2.4 isa和has-a的区别,类与类间的关系: isa关系: 继承和派生关系。 has-a关系: 一个类使用另一个类的对象作成员 一般来说:公有继承关系和isa关系是等价的。 但某些情况下: 企鹅是鸟 鸟会飞 企鹅会飞吗? 对象作成员表示has-a关系,245,6.2.4 公有继承存取权限表 什么是公有继承?,基类,派生类,基类对象,派生类对象,private public protected,不可访问 public protected,不可访问 可访问 不可访问,不可访问 可访问 不可访问,246,6.2.4 私有派生 定义派生类时,用private限定,class 派生类名:private 基类名 private: 成员列表; public: 成员列表; protected: 成员列表; ;,247,6.2.4 私有派生 定义派生类时,用private限定,基类的私有成员和不可访问成员在派生类中不可访问 基类的公有成员和保护成员变为私有成员,248,6.2.4 私有派生 假定有基类:base,249,6.2.4 私有派生 定义派生类时,用private限定,问题:,250,6.2.4 私有派生 定义派生类时,用private限定,问题:d对象是否可以使用fun1函数?,251,6.2.4 私有派生 定义派生类时,用private限定,基类的私有成员和不可访问成员在派生类中不可访问 基类的公有成员和保护成员变为私有成员,派生类的对象不可访问继承自基类的所有成员,派生类的成员函数可访问继承自基类的protected成员和public成员,252,6.2.4 保护派生 定义派生类时,用protected限定,降级使用 基类中的private变为不可访问 protect变为private public 变为protected,253,254,降级使用 基类中的private变为不可访问 protected变为private public 变为protected,255,6.3多重继承 一般形式:,class 类1:访问控制 类2, 访问控制 类3 private: /私有成员 protected: /保护成员 public: /公有成员 ,256,257,多重继承中成员访问权限的变化同单一继承! 以下访问是指在派生类的成员函数中使用成员 公有派生: 基类的private成员在派生类中可否访问? 基类的protected成员在派生类中可否访问? 基类的public成员在派生类中可否访问? 私有派生: 基类的private成员在派生类中可否访问? 基类的protected成员在派生类中可否访问? 基类的public成员在派生类中可否访问?,258,多重继承中成员访问权限的变化同单一继承! 保护派生: 基类的private成员在派生类中可否访问? 基类的protected成员在派生类中可否访问? 基类的public成员在派生类中可否访问?,259,6.4二义性及其支配规则,6.4.1作用域和成员名限定,260,6.4二义性及其支配规则,6.4.1作用域和成员名限定,261,6.4二义性及其支配规则,6.4.1作用域和成员名限定,262,6.4二义性及其支配规则,6.4.1作用域和成员名限定,当派生类中从多个基类中继承得到同名函数时,在派生类中使用这些函数时,须使用类名限定! 派生类的对象使用这些函数时,也需要进行类名限定!,类名:成员名,263,6.4二义性及其支配规则,6.4.2派生类支配基类的同名函数,264,6.4.2派生类支配基类的同名函数,C+的支配规则: 在基类和派生类有重名的成员时,优先派生类的成员如果要访问基类成员,必须加上作用域符: 私有(private)成员派生类不可以访问,只有本类和友类可以访问 如果派生类要访问基类的成员,基类成员应该用protected限定。,265,6.4.2派生类支配基类的同名函数,另注意: 一个类B不能从类A直接继承2或2次以上,266,第六章复习总结,类的单一公有继承、单一私有继承、单一保护继承、多重继承 规则 派生类的构造函数定义形式,及调用顺序 派生类的析构函数调用顺序。 protected成员 派生类和基类对象的赋值兼容规则 二义性及其支配规则(作用域限定),267,第七章类模板与向量,7.1类模板,复习内容:函数模板,268,3.5函数模板,有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。,269,3.5函数模板,有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。,270,3.5函数模板,有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。,271,3.5函数模板,函数模板定义格式:,定义函数模板后,函数调用时根据函数参数来类型来确定调用哪个版本的函数。函数执行时确定参数类型的函数称为模板函数。,272,3.5函数模板,此种形式调用中称为函数模板的参数 一般可省略。Typename可替代class,273,3.5函数模板,若某函数参数类型不一致时,也可定义函数模板。,274,7.1类模板,7.1.1类模板的基础知识 template class 类名 Private: /成员定义 Protected: /成员定义 Public: /成员定义 ,275,7.1类模板,template class 类名 ,类模板的对象: 类名 对象名(参数);,276,7.1类模板,类的成员函数定义(在类体外定义时):,模板类的成员函数定义形式: template 返回值类型 类名 : 函数名(参数) /函数体 ,普通类的成员函数定义形式: 返回值类型 类名 : 函数名(参数) /函数体 ,277,7.1类模板,278,7.1类模板,279,7.1.2类模板的派生与继承,280,7.1.2类模板的派生与继承,模板类继承普通类,模板类作普通类的派生类 继承后成员使用同一般类的继承。 模板类派生模板类
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!