已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 函数,函数的定义与使用内联函数带默认形参值的函数函数重载C+系统函数,函数的声明,函数是面向对象程序设计中的基本抽象单元,是对功能的抽象函数声明的语法形式类型标识符 函数名(形式参数表) 语句序列,函数的定义与使用,函数的声明,形式参数表 name1, name2, ., namen函数的返回值由 return 语句给出,例如:return 0无返回值的函数(void类型),不必写return语句。,函数的定义与使用,函数的调用,调用前先说明函数原型:在调用函数的说明部分,或程序文件开头所有函数之前,按如下形式说明:类型标识符 被调用函数名 (含类型说明的形参表)调用形式: 函数名(实参列表)嵌套调用函数不允许嵌套声明,但可以嵌套调用。递归调用函数直接或间接调用自身。,函数的定义与使用,例3-1 编写一个求x的n次方的函数,#include using namespace std; doublepower (double x, int n);void main(void)cout 5 to the power 2 is power(5,2) ab; couta、b的平方和:fun1(a,b)endl;int fun1(int x,int y) int fun2(int m); return (fun2(x)+fun2(y);int fun2(int m) return (m*m);,运行结果:3 4a、b的平方和:25,函数允许嵌套调用,如果函数1调用了函数2,函数2再调用函数3,便形成了函数的嵌套调用。,函数的定义与使用,嵌套调用,函数的定义与使用,递归调用,函数直接或间接地调用自身,称为递归调用。递归过程的两个阶段:递推:将原问题不断分解为新的子问题,逐渐从未知向已知推进,最终达到已知的条件,即递归结束的条件, 这时递推阶段结束。 4!=43! 3!=32! 2!=21! 1!=10! 0!=1未知 已知回归:从已知的条件出发,按照递推的逆过程,逐一求值回归,最后达到递推的开始处,结束回归阶段,完成递归调用。 4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知 已知,函数的定义与使用,例 求n!,分析:计算n!的公式如下:这是一个递归形式的公式,应该用递归函数实现。,函数的定义与使用,源程序:#include using namespace std;long fac(int n) long f; if (n0) coutn0,data error!n; y=fac(n); coutn!=yendl;运行结果:Enter a integer:88!=40320,函数的参数传递机制 传递参数值,在函数被调用时才分配形参的存储单元。实参可以是常量、变量或表达式。实参类型必须与形参相符。函数的参数传递 指就是形参与实参结合(简称形实结合)的过程。形实结合的方式有值调用和引用调用。,函数的定义与使用,函数的参数传递机制 传递参数值,值调用是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。 这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,以后无论形参发生了怎样的改变,都不会影响到实参。,函数的定义与使用,函数的参数传递机制 参数值传递举例,函数的定义与使用,例3 输入两整数,交换后输出,#includeusing namespace std; void Swap(int a, int b);int main( )int x(5), y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;void Swap(int a, int b) int t;t=a; a=b; b=t; ,函数的定义与使用,函数的参数传递 引用传递,引用(引用可以作为形参 void swap(int& a, int& b) .,函数的定义与使用,例 输入两个整数交换后输出,#includevoid Swap(int ,函数的定义与使用,执行主函数中的函数调用: Swap(x,y);,19,例: 通过指针调用交换变量值#include void Swap(int *a, int *b); /声明函数void main( )int x(5), y(10);coutx=x y=yendl;Swap( ,运行结果:x=5 y=10x=10 y=5,执行主函数中的函数调用:Swap(,引用与指针关系的分析区别: 1. 引用是某一对象的别名, 指针是某一变量的地址变量。 2. 引用在定义时就必须初始化, 即为一已定义的对象的别名, 不可以重新赋值。指针可在使用时初始化, 且可以重新赋值。,void Swap(int ,void Swap(int *a, int *b) /指针调用 int t; t=*a; *a=*b; *b=t; ,void Swap(int a, int b) /传值调用 int t=a; a=b; b=t; ,引用的作用: 1. 引用可以象地址一样完成对所代表的对象的操作。 2. 对引用的操作不同于对指针的操作,它可直接作用于变量,所以更方便, 更易于理解。引用的缺点: 引用不能为空,即必须代表某一对象,且不能重新赋值。指针灵活性较好,但使用较不方便。,内联函数声明与使用,内联函数,为什么要内联函数? 程序中对函数的调用过于频繁,导致程序执行时间加长。内嵌函数的使用可提高程序执行效率。,内联函数声明与使用,内联函数,内联函数作用机理 编译时在函数调用处用函数体进行替换,把内联函数的代码直接嵌入在每一个函数调用处,而不是转到调用函数的代码处。节省了参数传递、控制转移等开销。,内联函数的定义 在函数声明时加关键字inline例如:inline void swap(int,内联函数声明与使用,注意:内联函数体内不能有循环语句和switch语句。内联函数的声明必须出现在内联函数第一次被调用之前。对内联函数不能进行异常接口声明。,内联函数,内联函数的缺点 程序执行效率提高了,但可执行程序规模变大了。实际应用中要权衡效率和规模之间的关系。,例3-14 内联函数应用举例,#includeusing namespace std;inline double CalArea(double radius)return 3.14*radius*radius;int main( )double r(3.0);double area;area=CalArea(r);coutareaendl;return 0;,内联函数,默认形参值的作用,函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。例如:,int add(int x=5,int y=6) return x+y;,void main(void) add(10,20); /10+20 add(10); /10+6 add( ); /5+6,带默认形参值的函数,默认形参值的说明次序,有默认值的形参必须在形参列表的最后(最右边),即默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。因为调用时实参与形参的结合是从左向右的顺序。例:int add(int x,int y=5,int z=6); /正确int add(int x=1,int y=5,int z); /错误int add(int x=1,int y,int z=6); /错误,带默认形参值的函数,默认形参值与函数的调用位置,调用出现在函数体实现之前时,缺省形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,缺省形参值需在函数实现时给出。例:,int add(int x=5,int y=6);void main(void) add( ); /调用在实现前int add(int x,int y) return x+y; ,int add(int x=5,int y=6) return x+y; void main(void) add( ); /调用在实现后,带默认形参值的函数,默认形参值的作用域,在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不同的默认省形参。例:int add(int x=1,int y=2);void main(void) int add(int x=3,int y=4); add( ); /使用局部缺省形参值(实现3+4)void fun(void) . add( ); /使用全局缺省形参值(实现1+2),带默认形参值的函数,32,/3_15.cpp带默认形参值的函数举例#include #include int get_volume(int length, int width = 2, int height = 3);void main()int x = 10, y = 12, z = 15;cout Some box data is ;cout get_volume(x, y, z) endl;cout Some box data is ;cout get_volume(x, y) endl;cout Some box data is ;cout get_volume(x) endl;cout Some box data is ;cout get_volume(x, 7) endl;cout Some box data is ;cout get_volume(5, 5, 5) endl;,int get_volume(int length, int width, int height)coutsetw(5)lengthsetw(5)widthsetw(5)heightmn;coutinteger m+n=add(m,n)xy;coutc1.realc1.imaginary;coutc2.realc2.imaginary;c3=add(c1,c2);coutcomplex number ( c1.real , c1.imaginary )+(c2.real, c2.imaginary)=(c3.real, c3.imaginary)n;,int add(int m, int n) return m+n; double add(double x, double y) return x+y; complex add(complex c1, complex c2) complex c;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;return c;,运行结果:Enter two integer: 3 5integer 3+5=8Enter two real number: 2.3 5.8real number 2.3+5.8= 8.1Enter the first complex number: 12.3 45.6Enter the second complex number: 56.7 67.8complex number (12.3,45.6)+(56.7,67.8)= (69,113.4),函数模板的声明,代码重用模板就是可以使用和操作任何数据类型的通用代码构成把数据类型作为参数函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。声明方法:template 函数声明,函 数 模 板,例3-17 求绝对值函数的模板,#includetemplateT abs(T x) return x0?-x:x; void main( ) int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl;,函 数 模 板,运行结果:55.5分析编译器从调用abs( )时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:int abs(int x) return xa; b=a*pi/180; coutsin(a)=sin(b)endl; coutcos(a)=cos(b)endl; couttan(a)=tan
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年云南省青少年活动中心招聘(6人)笔试模拟试题及答案解析
- 年中考物理一轮专题复习(长沙)简单的光现象课件
- 2026年曲靖经济技术开发区市场监督管理局招聘城镇公益性岗位工作人员(1人)笔试备考试题及答案解析
- 2025年12月份四川成都市第八人民医院编外招聘9人考试参考试题及答案解析
- 小学英语微课教师培训课件
- 无创血液自动分析仪的临床应用探索
- 小学六年级语文毕业考试真题及解析
- 水泥搅拌桩施工安全技术交底要点
- 会计法规案例分析与法律责任
- 初中英语写作技巧及训练方案
- 党建阵地日常管理制度
- 车间医药箱管理制度
- T/CSPSTC 17-2018企业安全生产双重预防机制建设规范
- 遥感图像处理技术在城市更新中的应用
- 食叶草种植可行性报告
- 落叶清扫压缩机设计答辩
- 广东省建筑装饰装修工程质量评价标准
- 珍爱生命活在当下-高一上学期生命教育主题班会课件
- 楼板回顶施工方案
- 《煤矿开采基本概念》课件
- 湖北省武汉市洪山区2023-2024学年八年级上学期期末数学试题
评论
0/150
提交评论