第3章 函数和程序结构.ppt_第1页
第3章 函数和程序结构.ppt_第2页
第3章 函数和程序结构.ppt_第3页
第3章 函数和程序结构.ppt_第4页
第3章 函数和程序结构.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、,Chapter 3 函数和程序结构,3.1 函数的组织 3.2 局部变量和全局变量、命名空间std 3.3 形参与实参 3.4 引用和const 3.5 缺省参数值 3.6 函数重载 3.7 内联函数 3.8 编译预处理,3.1 函数的组织,结构化程序设计方法 使用结构化程序设计方法解决复杂的问题: 分解 大问题小问题更小问题 求解(调用) main() 函数函数,一个函数是根据进去的信息(输入)和产生的东西(输出结果)所定义的一个黑盒。,函数用于把较大的计算任务分解成若干个较小的任务,使程序人员可以在其他函数的基础上构造程序,而不需要从头做起。一个设计得当的函数可以把具体操作细节对程序中不

2、需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚,减轻了因修改程序所带来的麻烦。,程序示例计算(12+10)!/(12!+10!),for example:ch3/3-1-1.cpp for example:ch3/3-1-2.cpp 2层结构,2个函数,降低程序的构思、编写、调试的复杂度,可读性好,函数定义 返回类型 函数名(参数声明列表) 函数体; ,double max(double d1,double d2) return (d1d2 ? d1 : d2); ,return语句用于从被调用函数向调用者返回值。,没有返回值的函数、没有参数的函数,用关键字void修饰。 void f(

3、void) cout “aaaa” endl; ,就不需要return语句了,函数声明 任何函数先声明,后使用。 返回类型 函数名(参数声明列表);,double max(double d1,double d2); 或 double max(double,double);,函数调用 当调用一个带形式参数的函数时, 我们用到实际参数。实际参数是在调用时赋给相应的形式参数的特殊的值。,double max(double d1,double d2) return (d1d2 ? d1 : d2); Void main() double f1,f2; cin f1 f2; cout max(f1,f2

4、); cout max(67.4,23); ,形参,实参,实际参数可以是一个常量,变量,或甚至可以是一个表达式。,3.2 局部变量和全局变量,变量作用范围(作用域) 在函数内定义的变量 (包括形参) 局部变量 作用范围:本函数内部 定义在复合语句内的变量 作用范围:复合语句内部 全局变量 在函数以外定义的变量,不从属于任一函数 作用范围:从定义处到源文件结束,3-4.cpp,变量作用范围示例,int x=1; void main( ) int a=2; . int b=3; . f( ); . int t=4; void f( ) int x=5, b=6; . int a=7;,x=? a=

5、? b=?,b=?,x=5 b=6 t=4 a没定义,若局部变量与全局变量同名,局部变量优先,变量作用范围示例,int x=1; int f(int x) return(x+); main( ) int y; y=f(2) ; x=f(x) ; printf(“%d%d”, y, x); ,x=1,变量作用范围,如果局部变量与全局变量同名,局部变量优先。 不要滥用全局变量 有副作用,int x=1; void f1() x+; void f2() x = 5; void main( ) x = 10; f1(); cout x; f2(); cout x; ,11 5,程序是变量(全局)定义和

6、函数定义的集合。函数之间的通信可以通过参数、函数返回值以及外部变量进行。函数可以以任意次序出现在源文件中。源程序可以分成多个文件,只要不把一个函数分在几个文件中就行。,关键字extern 变量的定义与是声明是有不同的意义。 作用域运算符: 命名空间std 3-5-1.cpp 3-5-2.cpp,3.3 形参与实参,函数的参数 函数的参数分为形参和实参两种。 形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调

7、函数的数据传送。,函数的形参和实参具有以下特点:1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 3.实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。, 值传递 函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在

8、函数调用过程中,形参的值发生改变,而实参中的值不会变化。 For example:ch3/3-6.cpp,如何实现函数调用中发生的数据传送是双向的。 即修改了形参所指的单元,也就修改了实参。,3.4 引用和const,引用就是给某一已存在的对象取一别名(alias)。,refcount is a reference of an int,Which int to reference exactly?is count,as:int count=0; int,For example:ch3/3-8.cpp,rules when using references: A reference must b

9、e initialized when it is created. (Pointers can be initialized at any time.) int i; int /,rules when using references: 3. You cannot have NULL references. You must always be able to assume that a reference is connected to a legitimate piece of storage. int a=1; int /,References in functions int ,用co

10、nst表示常量对象,#define BUFSIZE 100 BUFSIZE只是一个名字,没有存储空间 问题:宏定义常量没有类型信息;宏定义常量是全局的(extern linkage);用宏定义常量编程,调试时,不能直接知道它的名字。,常量处理的老方法:,C+中的常量处理方法:const的最初动机是取代预处理器define进行值替代,For example:ch3/3-9.cpp,const int bufsize=100; (1)有类型信息; const int i = 20; chat chi;/正确 /以下程序错: int i; char chi;,const用于函数参数和返回值,int

11、f1(const int / Illegal - compile-time error, ,Returning by const value例1:const int g() return 1; 例2:const char* v() return result of function v(); ,3.5 缺省参数值,在C+中,函数声明时,可以为一个或多个参数指定缺省参数值。,例如: /function definition void delay(int k,int time ) /function code body,/ function declaration void delay(int k

12、,int time=300); /function call delay(5); /等价与delay(5,300);,理解要点: 当函数调用执行时,编译器从左到右顺序将实参与形参结合,若未指定足够的实参,则编译器按同样顺序用函数声明中的缺省值来补足所缺少的实参。 由于对缺省参数的处理是在函数调用表达式执行时进行的,所以,在函数声明中,“=”后面可以是任意复杂的表达式,甚至是函数调用。如: void delay(int k, int time=f(5); /其中f(5)是函数调用 所有带缺省值的参数一律放在函数声明中参数表的最右端。 void f(int, int y=1,int z); / 因

13、为:函数调用f(2,4)将产生二义性: 4 y 还是 4 z void f(int, int y=1, int z=2); / 在函数定义中,不再为参数指定缺省值。(内联函数除外),3.6 函数重载,一个函数名(标识符)可以被用作多个函数抽象的名字。编译时,根据这些函数的参数个数、参数类型来区分(束定/绑定binding) For example: unit three: function_overloading.dsw,二义性错误,Outline: 要确保不同的参数类型确实不同。 例如: typedef float real; float abs(float) / real abs(real

14、) /, 函数的返回类型不能区分重载函数 例如: int process(int)/ / float process(int) /,用修饰符(long/short等)而使类型有所 不同,则不能区分。 例如: float abs(long) / / double abs(int) /,仅仅用了const而使参数类型有所不同,则不能区分。 例如: int process(int)/ / float process(const int) /,Void Complex() apart=0.0; ipart=0.0; Void Complex(double d) apart=d; ipart=0.0;

15、Void Complex(double a,double b) apart=a; ipart=b; ,Void Complex(double a=0.0,double b=0.0) apart=a; ipart = b; When: Complex(); /be equal to Complex(0.0,0.0) Complex(2);/Complex(2,0.0),3.7 内联函数,function call need costs : involved from pushing arguments, making an assembly-language CALL, returning ar

16、guments, and performing an assembly-language RETURN,For example:ch3/3-10.cpp,在C+中,用inline function来替换带参宏的使用。C+的内联机制和C中的带参宏定义都是为了获得较高的运行速度。使用宏和内联函数增加了代码空间,但减少了程序执行时间 。因为不再有函数调用开销。但C+的内联机制比C中的带参宏定义更安全。,#include inline float area(float r) return 3.14*r*r; int main() float f=2; float s=area(f+); coutfen

17、dlsendl; return 0; ,inline function,作用:在一个函数定义之前加上关键字inline,则称该函数为内联函数。每当在其它程序中有对该内联函数的调用,C+编译器都使用该内联函数的代码替换该内联函数的调用表达式。,使用内联函数的优点: 参数的类型和函数返回值的类型都在函数声明中进行明确的指定。这便于编译器发现函数调用中的类型不一致的错误。 如果传入函数的是表达式,则此表达式仅求值一次。 内联函数只宜用于比较简单的函数(不含循环语句和switch语句)。如果内联函数的体很大,有可能使代码的规模急剧增加。,编译器如何内联? 64.内联函数和编译器 (1)编译器如何实现内

18、联? (2)内联的局限性: a)假如函数太复杂,编译器将不能执行内联(复杂的函数定义顺序、构造函数和析构函数). b)假如在程序中,隐含或显式取该函数的地址,则 c)在程序的Debug版本,不执行内联,3.8 编译预处理,在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令# include,宏定义命令# define等。在源程序中这些命令都放在函数之外, 而且一般都放在源文件的前面,它们称为预处理部分 。 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译。,语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、 移植和调试,也有利于模块化程序设计。本章介绍常用的几种预处理功能。,无参宏 #define PI 3.14159 #define NoBall 0 #define PlayerBall 1 #define ComputerBall 2 /无参宏,用符号表示常量, For example:3-9.cpp,有参宏和inline(内联)函数 #define aera(x) PI*(x)*(x) 利用有参宏来替代一些简单的函

温馨提示

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

评论

0/150

提交评论