函数与运算符的重载.ppt_第1页
函数与运算符的重载.ppt_第2页
函数与运算符的重载.ppt_第3页
函数与运算符的重载.ppt_第4页
函数与运算符的重载.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

2019/4/30,1,如何上大学 ?,2019/4/30,2,2019/4/30,3,高 等 教 育 出 版 社 2004年第2版,高级语言C+程序设计,第 5 章 函数与运算符的重载,2019/4/30,4,函数的定义和调用方法; - 5.2 函数调用时的参数传递方法; 函数的嵌套与递归 - 5.3 函数与运算符的重载 - 5.4 函数与C+程序结构 - 5.5 函数的重载和默认参数值; 4. 库函数的正确使用;,本章重点,2019/4/30,5,一. 函数的概念 1. 函数是一个完成特定功能的程序段,除主函数不能被其它函数调用外,其它函数可以通过函数调用语句以及参数的传递实现调用、以完成既定功能。 2. 函数的分类: (1) 主函数(main)和辅函数 (2) 标准函数(系统函数)和用户定义函数 (3) 无参函数和有参函数 无参函数 - 函数名( ) 有参函数 - 函数名( 形式参数表 ) 二. 函数的定义 定义格式:存储类型符 数据类型符 函数名(形式参数表) - 函数头 数据定义语句序列; 执行语句序列; 函数体 return ( 表达式 ) ; 存储类型: extern - 外部函数 (省略时的默认类型) static - 内部函数 (只能在本编译文件内使用) 数据类型:函数返回值的类型 ( 无返回值为 void 类型),5.1.1 函数值和return语句,2019/4/30,6,三. 函数值和return语句 (1) 函数值 - 被调函数执行后所返回的值. 无返回值时,则定义为 void(空)函数. (2) return语句 - 返回函数值的语句。 格式: return 表达式; 形式参数表格式: (数据类型 形式参数1 ,数据类型 形式参数2,. . . ) 【例6-1】调用函数比较2个数的大小并返回大数。 #include int max(int m1, int m2) using namespace std; int max(int, int); int x; int main() if(m1m2) x=m1; else x=m2; int a,b,x; return x; a=2,b=3; x=max(a, b); coutxendl; return 0; ,2019/4/30,7,一. 函数的调用形式 1. 调用格式: 函数名( 实际参数表) 2. 被调函数的声明 如果被调函数的定义在主调函数之后, 一般要对被调函数加以声明。 被调函数的声明格式: 数据类型符 被调函数名(形式参数表) ; 3. 调用方式 (1) 函数调用语句 【例6-2】函数调用语句 p.104 #include using namespace std; void room1(); void room2(); void main() ,5.1.2 函数调用形式,2019/4/30,8,cout double max(double m1, double m2) using namespace std; double max(int, int); if(m1m2) return m1; void main() else return m2; double a=2.5 , b=3.39, c=13.25; cout“max=”max(c, max(a,b) endl; ,2019/4/30,9,(4) 函数嵌套调用方式 【例6-3】函数嵌套调用 #include using namespace std; void room1(); void room2(); void main() cout“I am in main and call romm*.”endl; room1(); void room2() cout“Now I am in room2.”endl; void room1() cout“Now I am in room1 and call room2.”endl; room2(); ,2019/4/30,10,- 利用形参与实参在函数间传递数据 1. 形式参数 - 在声明函数时指定函数参数的名称、类型及个数。 形式参数表格式: ( 数据类型 形式参数1 ,数据类型 形式参数2,. . . ) 2. 实在参数 - 在函数调用时取代形参作为局部变量给予分配内存单元, 调用结束后,释放占用的内存单元。 实参在类型、数量以及次序上必须与形参保持一致。 形参变量作为被调函数的局部变量,单独分配内存。,5.1.3 函数的形式参数和实在参数,2019/4/30,11,1. 函数的调用过程 (1) 调用函数在遇到被调函数时, 将以函数名提供的地址执行一次 无条件转移指令; (2) 转移之前,将保护当前工作环境, 将下一条语句地址作为断点加以 保护, 然后转去执行被调函数; (3) 函数执行结束,或遇到返回语句 return时,将恢复原来调用函数 的工作环境,返回到断点处继续 执行。 调用函数 被调函数 2. 函数的返回区 - 返回到调用函数断点处继续执行。,5.1.4 函数的返回区,断点,2019/4/30,12,一. 预处理命令 1. 包含语句 格式:#include (带路径的头文件名格式: 盘符:文件夹名.头文件名) 例: d:vc6includestdio.h 常用的头文件: #include / 用于数学函数 #include / 用于字符串函数 #include / 用于格式输出 2. 宏定义语句 格式:#define 宏名 代换正文 例: #define MAX(a,b) (a)(b)? (a) : (b) 【试题例】 #define R a+b #define PI 3.1415 若: int a=2, b=3; area = PI * R*R ; coutarea ; 问:输出结果是:_ ? 15.28 / 78.5,5.2 编译指令,2019/4/30,13,二. 条件编译命令 1. #if 条件表达式 语句 / 条件成立时编译内容 #else 语句 / 条件不成立时编译内容 #endif 2. defined 预处理操作符 格式:defined ( 标识符 ) 功能:当“标识符”被 #define 定义,则返回逻辑值“真”(1), 否则,则返回逻辑值“假”(0) 。 【例】 #include using namespace std; #define DEBUG void main( ) int i=555; / 程序 #if defined ( DEBUG ) cout“DEBUG: value of i is ” i endl; #endif ,2019/4/30,14,2. 设计一个简单的加密程序,它把当前的字母变成下一个字母。例如把“a”变成“b”, 把“z”变成“a”,但其它字符不变。用条件编译方法实现选择。 【解】分析问题: (1) 如何把“a”变成“b” 若: ch = a ; ch+; / 字母的ASCII码值 加 1 ,变成下一个字母 (2) 如何把“z”变成“a” ch+; if(chz) ch=a; (3) 条件编译方法 #define JIAMI #if defined JIAMI if (ch=a #endif 参考程序,2019/4/30,15,#include using namespace std; #include #define JIAMI void main() char ch= ; while(ch!=3) ch=getch(); cout=a ,2019/4/30,16,1. 什么是内联函数 ? -内联函数是函数的一种特殊形式,即将被调用函数的函数体直接插入到调用函数内部的调用方式。 在C+程序中符合下列条件的函数为内联函数: 函数说明前冠以“inline”关键字的函数。 类内定义的函数成员(将在第七章介绍)。 2. 内联函数的定义方式 inline 函数类型 函数名( 形式参数表 ) 函数体 3. 内联函数使用规则 (1) 内联函数适用于较小的函数,以防程序代码增加过多; (2) 具有循环语句、switch语句的函数不能说明为内联函数; (3) 内联函数必须在调用该函数之前定义。,5.3 内联函数,2019/4/30,17,【例】 #include using namespace std; inline int isnumber( char c ) return ( c=0 ,2019/4/30,18,一. 函数重载 - 为同一个函数定义几个版本称为函数重载. 特点: (1) 重载函数具有同一函数名,但功能不同; (2) 重载函数的形式参数个数、类型、或顺序不同,用以区分函数; (3) 不同函数类型不能区分重载函数. 【例6-5】重载函数产生多态性 #include using namespace std; double max(double, double); / 2个实型参数的函数原型 int max(int, int); / 2个整型参数的函数原型 char max(char, char); / 2个字符型参数的函数原型 int max(int, int, int); / 3个实型参数的函数原型 void main() coutmax(2.5, 17.54)“ ”max(56,8)“ ”max(w, p)endl; cout“max(5,9,4 )=”max(5,9,4)“max(5,4,9)= ”max(5,4,9)endl; ,5.4 函数重载和默认函数,2019/4/30,19,double max(double m1, double m2) / 2个实型参数的函数原型 return (m1m2)? m1 : m2; int max(int m1, int m2) / 2个整型参数的函数原型 return (m1m2)? m1 : m2; char max(char m1, char m2) / 2个字符型参数的函数原型 return (m1m2)? m1 : m2; int max(int m1, int m2, int m3) / 3个实型参数的函数原型 int t=max(m1,m2); return max(t, m3); 运行结果: 17.54 56 w max(5,9,4 )=9 max(5,4,9)=9 二. 函数的默认参数值 - 函数的形式参数具有默认值. 1. 默认值指定方法 (1) 声明函数原型或定义函数时必须在参数表中指定默认值; (2) 具有默认值的参数应当位于形参表的最右端; (3) 使用默认参数,不能对少于参数个数的函数进行重载。,2019/4/30,20,2. 默认参数的使用 - 如果提供实际参数值,则使用实际参数值,否则函数采用默 认参数值。 【例6-6】 #include using namespace std; int add(int m1=0, int m2=0, int m3=0, int m4=0) return m1+m2+m3+m4 ; void main( ) coutadd(1,3)“,” add(1,3,5)“,” add(1,3,5,7)endl; 运行结果:4,9,16,2019/4/30,21,常 量,1. 正确包含头文件 - 不同的库函数在不同的头文件中定义,使用库函数必须包含相应的头文件. 【例6-7】使用数学函数必须包含 math.h头文件 #include using namespace std; #include /数学函数必须包含 math.h头文件 void main( ) float x,y,z; cin xy; z = fabs(x-y); coutx“-”y“的绝对值为”zendl; ,5.5 正确使用库函数,2019/4/30,22,2. 正确使用库函数 注意函数参数的类型 【例6-8】求30o的正弦值 #include using namespace std; #include void main( ) float x; x = sin(30.0); cout“x=”xendl; ,2019/4/30,23,【例6-9】求 x/y 的余数 #include using namespace std; #include void main( ) / 求 x/y 的余数 double x,y,z; /float z; / 函数原型是: double fmod(double , double) x=10.5; y=3; z = fmod(x, y); cout“z=“ z endl; ,2019/4/30,24,6.6.1 计算机解题步骤 1. 设计解题的方法; 2. 用类计算机语言描述解题方法; 3. 将类计算机语言转换成计算机语言程序; 4. 编辑C+源程序; 5. 编译C+源程序、查错、修改,直至产生.obj文件; 6. 连接成.exe文件; 7. 运行.exe文件; 8. 验证结果,发现错误,返回修改,直至获得正确结果。 【例6-11】 编写一个求 m 的阶乘的函数。 1. 分析问题: m!= 123m 2. 描述解题方法: f=1; 重复计算 f=f * i; (i=1,2, ,m) 3. 编写程序; 4. 编辑 CH6Li11.CPP文件;,5.6 解题和算法描述,2019/4/30,25,int fac (int m) int i, h; h=1; for(i=1; i using namespace std; #include “CH6Li11.cpp“ void main( ) int m; cin m; coutm“!=“ fac(m)endl; 7. 运行 ; 8. 验证结果,正确。,2019/4/30,26,【例6-12】根据汽车肇事线索,追查肇事汽车。 P.114 线索:甲:牌照3,4位相同; 乙:牌号为 31XXXX; 丙:牌照5,6位相同; 丁:36位是一个整数的平方. 1. 分析问题: 3,4位相同,是同一个数字x,可从0至9作试探; 5,6位相同,是同一个数字y,可从0至9作试探; 36位是一个整数的平方,满足: xxyy = n2 , n的范围从 (0011)1/2 至 (xxyy)1/2. 2. 参考程序,2019/4/30,27,#include using namespace std; void main( ) int i,j,k,c; for(i=1; i= k ! if(c*c = k) cout“牌照号码是:” 310000 + k endl; 运行结果:牌照号码是:317744,2019/4/30,28,6.6.2 常用过程设计算法的描述方法 1. 传统流程图符号 开始结束框 输入输出框 处理框 判断框 程序流方向线,连接框,2019/4/30,29,2. 简单程序流程图 n y,开 始,输入数据,数据处理,结束否?,输出数据,结 束,2019/4/30,30, 可重载运算符 运算符重载函数的定义 格式: 类型 operator 运算符( 参数表 ) 函数体 其中:函数名为 operator 运算符 运算符重载函数的调用方式: 方式1:与原运算符相同的调用方式 如 : a + b 方式2:一般函数调用方式 如:operator + ( a, b ) / 相当于 a+b,2019/4/30,31, 函数间的数据传递 (1) 通过赋值参数和返回语句 ; (2) 通过全局变量 ; (3) 通过指针类型参数; (4) 通过引用类型参数 ; (5) 通过函数的数组类型参数 ; .,2019/4/30,32, 运算符重载 运算符重载是对已有的运算符赋予多重含义 必要性 C+中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类) 实现机制 将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。 编译系统对重载运算符的选择,遵循函数重载的选择原则。,2019/4/30,33,规则和限制 可以重载C+中除下列运算符外的所有运算符: . .* : ?: 只能重载C+语言中已有的运算符,不可臆造新的。 不改变原运算符的优先级和结合性。 不能改变操作数个数。 经重载的运算符,其操作数中至少应该有一个是自定义类型。,2019/4/30,34, 两种重载形式 重载为类成员函数。 重载为友元函数。 运算符重载函数 声明形式 函数类型 operator 运算符(形参) 重载为类成员函数时 参数个数=原操作数个数-1 (后置+、-除外) 重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参。,2019/4/30,35,【例 6.1】 将“+”、“-”运算重载为复数类的成员函数。 规则: 实部和虚部分别相加减。 操作数: 两个操作数都是复数类的对象。 .,2019/4/30,36,#include using namespace std; class complex /复数类声明 public: /外部接口 complex(double r=0.0,double i=0.0)real=r;imag=i; /构造函数 complex operator + (complex c2); /+重载为成员函数 complex operator - (complex c2); /-重载为成员函数 void display(); /输出复数 private: /私有数据成员 double r

温馨提示

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

评论

0/150

提交评论