第6讲函数ppt课件_第1页
第6讲函数ppt课件_第2页
第6讲函数ppt课件_第3页
第6讲函数ppt课件_第4页
第6讲函数ppt课件_第5页
已阅读5页,还剩23页未读, 继续免费阅读

下载本文档

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

文档简介

1、计算机程序设计基础第六讲 函数2清华大学 郑 莉教材:第4版第3章 3.23.7C+语言程序设计(第4版),郑莉,清华大学目录6.1 内联函数6.2 带缺省形参值的函数6.3 函数重载6.4 运用C+系统函数6.5 深度探求6.6 小结2C+语言程序设计(第4版),郑莉,清华大学6.1 内联函数 声明时运用关键字 inline。 编译时在调用途用函数体进展交换,节省了参数传送、控制转移等开销。 留意: 内联函数体内不能有循环语句和switch语句。 内联函数的声明必需出如今内联函数第一次被调用之前。 对内联函数不能进展异常接口声明。3C+语言程序设计(第4版),郑莉,清华大学例6-1教材例3-

2、14 内联函数运用举例#include using namespace std;const double PI = 3.14159265358979;inline double calArea(double radius) return PI * radius * radius;int main() double r = 3.0;double area = calArea(r);cout area endl;return 0;46.1 内联函数C+语言程序设计(第4版),郑莉,清华大学6.2 带缺省形参值的函数 函数在声明时可以预先给出缺省的形参值,调用时如给出实参,那么采用实参值,否那么采用

3、预先给出的缺省形参值。 例如: int add(int x = 5,int y = 6) return x + y; int main() add(10,20);/10+20add(10); /10+6add(); /5+6 5C+语言程序设计(第4版),郑莉,清华大学缺省形参值的阐明次序 有缺省参数的形参必需在形参列表的最后,也就是说缺省形参值的右面不能有无缺省值的参数。由于调用时实参与形参的结合是从左向右的顺序。 例: int add(int x, int y = 5, int z = 6);/正确 int add(int x = 1, int y = 5, int z);/错误 int

4、add(int x = 1, int y, int z = 6);/错误66.2 带缺省形参值的函数C+语言程序设计(第4版),郑莉,清华大学缺省形参值与函数的调用位置 假设一个函数有原型声明,且原型声明在定义之前,那么缺省形参值必需在函数原型声明中给出;而假设只需函数的定义,或函数定义在前,那么缺省形参值需在函数定义中给出。 例:76.2 带缺省形参值的函数int add(int x = 5,int y = 6) /只需定义,没有原型声明 return x + y;int main() add();int add(int x = 5,int y = 6);/原型声明在前int main()

5、add(); int add(int x,int y) /此处不能再指定缺省值 return x + y;C+语言程序设计(第4版),郑莉,清华大学例6-2教材例3-15计算长方体的体积 子函数getVolume是计算体积的函数,有三个形参:length长、width宽、height高,其中width和height带有缺省值。主函数中以不同方式调用getVolume函数,分析程序的运转结果。86.2 带缺省形参值的函数C+语言程序设计(第4版),郑莉,清华大学#include #include using namespace std; int getVolume(int length, int

6、 width = 2, int height = 3); int main() const int X = 10, Y = 12, Z = 15;cout Some box data is ;cout getVolume(X, Y, Z) endl;cout Some box data is ;cout getVolume(X, Y) endl;cout Some box data is ;cout getVolume(X) endl;return 0; int getVolume(int length, int width/* = 2 */, int height/* = 3 */) cou

7、t setw(5) length setw(5) width setw(5) height t;return length * width * height;96.2 带缺省形参值的函数例6-2续C+语言程序设计(第4版),郑莉,清华大学6.3 函数重载 C+允许功能相近的函数在一样的作用域内以一样函数名声明,从而构成重载。方便运用,便于记忆。 例:10形参类型不同int add(int x, int y);float add(float x, float y);形参个数不同int add(int x, int y);int add(int x, int y, int z);C+语言程序设计(

8、第4版),郑莉,清华大学本卷须知116.3 函数重载 不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:int add(int x,int y);int add(int a,int b);编译器不以形参名来区分int add(int x,int y);void add(int x,int y);编译器不以前往值来区分int add(int x, int y) return x + y; float add(float x,float y) return x - y; 重载函数的形参必需不同:个数不同或类型不同。 编译程序将根据实参和形参的类型及个数的最正确匹配来选择调

9、用哪一个函数。C+语言程序设计(第4版),郑莉,清华大学例6-3教材例3-16重载函数运用举例编写两个名为sumOfSquare的重载函数,分别求两整数的平方和及两实数的平方和。126.3 函数重载C+语言程序设计(第4版),郑莉,清华大学#include using namespace std;int sumOfSquare(int a, int b) return a * a + b * b;double sumOfSquare(double a, double b) return a * a + b * b;int main() int m, n; cout m n; cout Thei

10、r sum of square: sumOfSquare(m, n) endl; double x, y; cout x y; cout Their sum of square: sumOfSquare(x, y) endl; return 0;136.3 函数重载例6-3续C+语言程序设计(第4版),郑莉,清华大学运转结果:运转结果:Enter two integer: 3 5Their sum of square: 34Enter two real number: 2.3 5.8Their sum of square: 38.93例6-3续6.3 函数重载C+语言程序设计(第4版),郑莉,

11、清华大学6.4 运用C+系统函数 C+的系统库中提供了几百个函数可供程序员运用。 例如:求平方根函数sprt、求绝对值函数abs等。 运用系统函数时要包含相应的头文件。 例如:cmath 或 math.h15C+语言程序设计(第4版),郑莉,清华大学例6-4教材例3-17 系统函数运用举例 标题: 从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。 分析: 系统函数中提供了求正弦值、余弦值和正切值的函数:sin()、cos()、tan(),函数的阐明在头文件cmath中。166.4 运用C+系统函数C+语言程序设计(第4版),郑莉,清华大学#include #include using

12、 namespace std;const double PI = 3.14159265358979;int main() double angle;cout angle;/输入角度值double radian = angle * PI / 180;/转化为弧度值cout sin( angle ) = sin(radian) endl;cout cos( angle ) = cos(radian) endl;cout tan( angle ) = tan(radian) Visual Studio - Visual C+ - Reference - Libraries Reference -Ru

13、n-Time Library - Run-Time Routines by Category 196.4 运用C+系统函数C+语言程序设计(第4版),郑莉,清华大学6.5.1运转栈与函数调用的执行 形参和部分变量的存储 为什么不能为形参和部分变量分配固定地址? 他们仅在函数调用时生效,函数前往后即失效,分配固定地址呵斥空间浪费 更重要的是,发生递归调用时,多次调用间的形参和部分变量应彼此独立 需求栈式存储206.5 深度探求C+语言程序设计(第4版),郑莉,清华大学栈 栈是一种包容数据的容器 数据只能从栈的一端存入压入栈 数据只能从栈的同一端取出弹出栈216.5 深度探求 6.5.1 运转栈与

14、函数调用的执行ana2a1压入栈弹出栈栈顶栈底C+语言程序设计(第4版),郑莉,清华大学运转栈 运转栈是一段区域的内存空间 运转栈分为一个一个栈帧 每个栈帧对应一次函数调用 栈帧中包括: 本次函数调用的形参值 控制信息 部分变量值 一些暂时数据 函数调用时,会一个栈帧被压入运转栈 前往时,会有一个栈帧被弹出226.5 深度探求 6.5.1 运转栈与函数调用的执行C+语言程序设计(第4版),郑莉,清华大学运转栈表示图unsigned fac(unsigned n) unsigned f; if (n = 0) f = 1; else f = fac(n - 1) * n; return f;in

15、t main() unsigned n; cin n; unsigned y = fac(n); 236.5 深度探求 6.5.1 运转栈与函数调用的执行n: 0f: ?n: 1y: ?n: 1f: 1main()fac(1)fac(0)栈顶C+语言程序设计(第4版),郑莉,清华大学函数调用的执行过程 栈指针esp:指向运转栈栈顶 帧指针ebp:定位形参和部分变量 传送参数:调用前把实参压入堆栈 函数调用时的几步关键操作 call指令:将下一条指令地址前往地址压入运转栈,转到函数入口地址 被调函数入口处:将当前ebp压入运转栈,用ebp保管esp,调整esp为部分变量留出空间 被调函数出口处:

16、用ebp恢复esp,从运转栈中弹出ebp原值 ret指令:将前往地址从运转栈弹出,转到前往地址246.5 深度探求 6.5.1 运转栈与函数调用的执行C+语言程序设计(第4版),郑莉,清华大学运转栈的数据分布unsigned fac(unsigned n) unsigned f; if (n = 0) f = 1; else f = fac(n - 1) * n; return f;256.5 深度探求 6.5.1 运转栈与函数调用的执行部分变量febp原值前往地址参数n调用fib(n-1)的参数nespebpfib的栈帧形参和部分变量定位:形参和部分变量定位:ebp 8:形参:形参nebp

17、+ 4:部分变量:部分变量fC+语言程序设计(第4版),郑莉,清华大学6.5.2 函数声明与类型平安 以错误方式调用函数的危险性 函数的原型信息参数个数和类型、前往值类型在编译后即不存在; 假设不要求声明函数,以错误的方式错误的参数数量或类型调用函数,会产生不可预期的结果,但很多情况下不会给出错误提示。 函数原型是主调函数与被调函数间的协议 运转结果错误 vs 编译错误 一个错误,与其被淹没在运转中,不如暴露在编译时。266.5 深度探求C+语言程序设计(第4版),郑莉,清华大学C言语的反例276.5 深度探求 6.5.2 函数声明与类型平安 C言语允许 只声明函数名和前往类型,而不声明参数类型 不声明函数,直接调用 后果:隐蔽错

温馨提示

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

评论

0/150

提交评论