C++程序设计.ppt_第1页
C++程序设计.ppt_第2页
C++程序设计.ppt_第3页
C++程序设计.ppt_第4页
C++程序设计.ppt_第5页
已阅读5页,还剩354页未读 继续免费阅读

下载本文档

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

文档简介

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+的不同点: 称呼不同,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进制数,0x前缀表示16进制 加L、l后缀表示长整型常量 实型: F、f后缀表示浮点型常量(float) 实数加L、l后缀表示long double型 无前缀,无后缀的为double型,38,6,常量表示,0L 123l 05 5 0x5 0xaf 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+中新的表示形式。 引用即使用变量的别名。 定义形式:数据类型 & 别名=对象名;,43,使用引用时注意: 1,不能定义引用的引用 int 2,不能直接定义数据组的引用,44,1.2.4 引用的使用方法(综合应用),一般格式:typedef 类型 类型别名 使用typedef定义某类型别名后,可使用该别名来定义相关对象。 例如:typedef long int lint; 则 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=E2 E1是左值,是可被修改的 int *p,x=1; *p=2; &p表示什么?,48,1.2.5 对指针使用const限定符(识记),2,指向常量的指针 const常量定义, 表示const后的表达式不可改变,定义时必须给出表达式的值。 int x=11; const int *P; const int *P= 表示*P是不可改变的。*P不能在=左侧。 P=&y; x=12;,49,1.2.5 对指针使用const限定符(识记),3,常量指针 const常量定义, 表示const后的表达式不可改变,定义时必须给出表达式的值。 int x=11; int * const P ; 错!必须初始化 int * const P =&x ; 表示P是不可改变的。P不能在=左侧。 *p可改变。,50,1.2.5 对指针使用const限定符(识记),4,指向常量的常量指针 const常量定义, 表示const后的表达式不可改变,定义时必须给出表达式的值。 int x=11; const int * const P =&x ; 表示P是不可改变的。*p不可改变。,51,1.2.6 泛型算法应用于普通数组(识记) 掌握数据的简单输入输出(简单应用) 泛型算法是C+ 标准模板库(Standard Template Library) 提供的一组操作。利用这些操作可以简化数组操作。 要使用这些操作必须包含头文件,52,1.2.6 泛型算法应用于普通数组(识记) 假定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数组,53,1.2.6 泛型算法应用于普通数组(识记) 假定a,b是两个数组名,其长度为len 操作示例: 3,sort(a,a+len) 将数组a中的元素按升序排序 4,sort(a,a+len,greater() 将数组a中的元素按降序排序,54,1.2.6 泛型算法应用于普通数组(识记) 假定a,b是两个数组名,其长度为len 操作示例: 5,find(a,a+len,value) 在数组a中查找值为value的元素,并返回位置指针,55,1.2.6 泛型算法应用于普通数组(识记) 假定a,b是两个数组名,其长度为len 操作示例: 6,输出数组中的内容 Copy(a,a+len, Ostream_iterator (cout,”字符串”)) Ostream_iterator表示输出流操作符 :表示要输出的数组类型 Cout表示流输出操作 “字符串”:表示分隔字符串,56,第一章认识C+的对象,1.2认识C+语言面向过程编程的特点,本节要点:,1.2.7 数据的简单输入输出(简单应用),57,第一章认识C+的对象,1.3程序的编辑、编译、运行,58,第一章认识C+的对象,课后题: P26 三、改错题 写作业本上,59,第二章从结构到类的演变,2.1结构的演化 . 结构发生质的演变 1. 函数与数据共存,C+允许结构中定义函数,成为成员函数 在结构中同时定义成员变量与成员函数 使用格式: 结构对象.成员变量 结构对象.成员函数,60,第二章从结构到类的演变,1. 函数与数据共存结构的定义,struct point double x,y; void Setxy(double a, double b) x=a; y=b; void Display() cout x“t“yendl; ;,61,第二章从结构到类的演变,1. 函数与数据共存结构的定义,struct point double x,y; void Setxy(double a, double b) x=a; y=b; void Display() cout x“t“yendl; ;,数据成员,成员函数,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)和(x3,y3)距离 计算(x2,y2)和(x3,y3)距离 输出三个距离,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(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,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引用作为函数参数 引用作函数参数: 类型 函数名(类型 &参数,) 函数调用时,实参对象名传递给形参对象名,形参对象名成为实参的别名,函数中对形参的改变就会导致实参值的改变。,119,3.1函数的参数及其传递方式,3.1.3引用作为函数参数 引用作函数参数: 类型 函数名(类型 &参数,) 函数调用时,实参对象名传递给形参对象名,形参对象名成为实参的别名,函数中对形参的改变就会导致实参值的改变。,120,3.1函数的参数及其传递方式,3.1.3引用作为函数参数 引用作函数参数: 类型 函数名(类型 &参数,),121,3.1函数的参数及其传递方式,3.1.3引用作为函数参数 引用作函数参数 说明: 1,引用对象不是一个独立对象,不占用内存。 2,对象的指针作参数时,指针变量中存放实参对象的地址。 3,引用对象作参数时,函数调用时形参对象和实参对象共用一个内存单元。,122,引用数组名作参数,123,引用数组名作参数,一般格式:typedef 类型 类型别名 使用typedef定义某类型别名后,可使用该别名来定义相关对象。 例如:typedef long int lint; 则 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.2.2定义构造函数,初始化列表,初始化列表,161,4.2.3 构造函数和运算符new,New和构造函数一同起作用,即new首先给对象分配内存,然后自动调用构造函数来初始化这块内存。,注意:new建立的动态对象只能用delete删除,一边释放空间。,162,4.2.4构造函数的默认参数,这是错误的,因为Point()比有默认参数的函数少。,163,4.2.5复制构造函数 :(const ,Point(Point &p)比有默认参数的函数少,为什么它是对的。,164,4.3析构函数 析构函数的调用由编译器自动调用 析构函数名在类名前加 析构函数无返回值 析构函数无参数,可以显示说明为void 析构函数不可以重载 析构函数在对象生命期结束的时候由系统自动调用。,165,4.3.1定义析构函数,类的对象数组的每个元素调用一次构造函数,调用一次析构函数。 全局对象数组的析构函数在程序结束之前被调用。,166,4.3.2析构函数和运算符delete delete后自动调用析构函数。与new相反。 p81 例4.8 4.3.3默认析构函数 编译器为没有析构函数的类自动产生一个空体析构函数,与构造函数类似。 总结:分配几次内存调用几次构造函数,反之调用析构函数,167,4.4调用复制构造函数的综合实例 p82【例4.9】,168,4.5成员函数重载及默认参数 p85【例4.10】,169,4.6 this指针 this指针是c+实现粉状的一种机制,它将对象和该对象调用的成员函数连接在一起。 this指针保证了每个对象可以拥有自己的数据成员。,170,4.7一个类的对象作为另一个类的成员 p87【例4.11】,171,4.8类和对象的性质 4.8.1对象的性质 同一类的对象之间可以相互赋值; 可以使用对象数组; 可以使用指向对象的指针; 对象可以用作函数参数; 对象作为函数参数时,可以使用对象、对象引用和对象指针; 一个对象可以用作另一个类的成员。,172,4.8.1类的性质 使用类的权限 不完全的类声明 只用当使用类产生对象时,才进行内存分配; 类没有完全定义之前就引用该类 不完全声明仅用于类和结构 空类 类作用域 类中默认控制权限时private,173,4.9面向对象的标记图 UML(Unified Modeling Language)时1992年面向对象管理组(OMG)制定的面向对象分析和设计的国际标准。 UML时一种可视化建模语言,主要用于面向对象分析和建模。,174,4.9.1类和对象的UML标记图(识记),Car,175,176,4.9.2对象的结构与连接(识记),177,4.10面向对象编程的文件规范 4.10.1 编译指令 (识记) 4.10.2 在头文件中使用条件编译(领会),178,第五章特殊函数和成员,5.1对象成员的初始化,类的定义:,179,5.1对象成员的初始化,180,5.1对象成员的初始化,181,5.1对象成员的初始化,示例【5.1】 double 变成了其他类,182,5.2静态成员 成员定义时使用了static关键字 1,静态成员变量的初始化只能在类外进行。 2,类中的任何成员函数都可访问静态成员变量 3,访问静态成员时,一般加上类名限定。 4,静态成员变量是类的成员,不是对象的成员. 5,对象未建立之前静态成员已经存在。 6,静态成员没有this指针,除非使用引用方式否则不能存取类的成员。,183,5.2静态成员-静态对象,184,5.3友元函数 可以实现两个类之间无限制的存取另一个类的成员。 友元函数可以访问私有成员,公有成员和保护成员。友元函数可以是一个类或函数。友元需通过对象来使用类的成员。 友元的三种形式: 1,普通函数作一个类的友元 2,a类的成员函数作b类的友元 3,a类作为b类的友元,185,5.3友元函数 1,普通函数作一个类的友元 例5.4,186,5.3友元函数 2,a类的成员函数作b类的友元,187,5.3友元函数 2,a类的成员函数作b类的友元,188,5.3友元函数 2,a类的成员函数作b类的友元,189,5.3友元函数 3,a类作b类的友元,190,总结:友元函数 可以实现两个类之间无限制的存取另一个类的成员。 友元函数可以访问私有成员,公有成员和保护成员。友元函数可以是一个类或函数。友元需通过对象来使用类的成员。 友元的三种形式: 1,普通函数作一个类的友元 2,a类的成员函数作b类的友元 3,a类作为b类的友元,191,5.4const对象 const可限定变量、指针、对象、函数、数据成员、成员函数。表示不可改变。 1,const成员 2,const对象 3,const函数 1,const成员 区别于const变量 const变量定义时需要初始化。 const成员在构造函数中初始化 (初始化列表形式),192,5.4const对象 1,const成员 区别于const变量,193,5.4const对象 1,const成员 区别于const变量,194,5.4const对象 2,const引用作参数,195,5.4const对象 2,const对象和const函数 const 对象只能调用const成员函数 const 函数中不允许使用改变变量或成员值的语句,196,复习上节 对象初始化:构造函数两种定义形式。 const限定的数据成员 引用数据成员 静态成员:静态数据成员,静态成员函数 友元:普通函数做友元 类的成员函数做友元 类做友元 const成员:const数据成员(const引用) const成员函数 const对象,197,复习上节 类的对象数组:对象数组中的每个元素都是一 个对象。 对象数组元素的使用同普通对象使用。 对象的指针: 指向对象的指针使用对象的成员函数和数据成员。 对象指针数组:数组中每个元素都是一个指向对象的指针。 指向函数的指针:函数有地址,指针能存地址,指针可以指向函数。,198,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的使用同普通对象使用方式相同,199,5.5数组和类 类可定义对象数组,可定义指向对象的指针 数组名是数组在内存中的首地址 指针可以存放地址 可用指针指向数组 通过指针可以使用对象成员p-show() 通过指针可以使用对象数组元素的成员 Pa;a0.show(); p-show();,200,5.5数组和类 定义对象的指针数组 int *p;表示定义一个指针变量 int p5;表示定义一个数组。 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), new 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; 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,设计类,定义类的成员函数,210,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对象一旦定义存在于内存中,直到程序结束才释放内存。,217,静态成员 不依赖于对象而存在。 静态成员使用注意: 非静态对象 静态成员 可否使用? 静态对象 静态成员 可否使用? 静态对象 非静态成员 可否使用? 静态成员函数 非静态成员 可否使用? 非静态成员函数 静态成员 可否使用?,218,静态成员 不依赖于对象而存在。 其他注意事项: p108 1-7 静态函数没有this指针 不能声明为virtual函数,219,友元 普通函数作友元 类的成员函数作友元 类作友元 类A的友元(函数,成员函数,类)可以访问类A中的所有成员,但必须通过对象或引用来访问。 友元应在类A中利用friend声明,220,const对象 const数据成员 const成员函数 const指针 const变量 const引用 加const限定后不可改变,任何企图改变都导致错误,并应注意他们的初始化!,221,使用规则: const对象 不能调用任何非const成员函数 const成员函数只能调用const成员函数 非const对象可以调用const成员函数 非const对象可以使用const数据成员 const成员函数中不能使用任何试图改变变量值的语句。,222,数组和类 类可以定义对象 类可以定义对象数组 对象数组中的每个元素都是对象,其使用方式和对象的使用方式相同。 对象数组名表示数组的首地址 可以定义指向对象的指针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,第六章继承和派

温馨提示

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

评论

0/150

提交评论