《面向对象编程技术-3(第三章 函数)课件》由会员分享,可在线阅读,更多相关《面向对象编程技术-3(第三章 函数)课件(25页珍藏版)》请在金锄头文库上搜索。
1、第三章 函数,函数的定义与使用 内联函数 带默认参数的函数 函数重载 函数模板 使用C+系统函数,本章的主要内容。,第一节 函数的定义与使用,函数的分类 一、 从函数定义的角度看,分为库函数和用户定义函数两种。 (1) 库函数 由系统提供,调用前包含有该函数原型的头文件。 在前面各章中用到printf、scanf 等函数均属此类。 (2) 用户定义函数 由用户按需要写的函数。不仅要在程序中定义函数本身, 而且在主调函数模块中还必须对该被调函数进行类型说明。,第一节 函数的定义与使用,二、从功能的角度分类。 (1) 有返回值函数 执行后将向调用者返回值。须在函数定义和函数说明中明确返回值的类型。
2、 (2) 无返回值函数 执行后不向调用者返回值。指定它的返回为“空类型”“void”。,第一节 函数的定义与使用,三、 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。 (1) 无参函数 函数定义和说明及函数调用时均不带参数。 主调函数和被调函数之间不进行参数传送。 (2) 有参函数 在函数定义及函数说明时都有参数,称为形式参数(形参)。在函数调用时须给出实际参数(实参),主调函数把实参传给形参。,第一节 函数的定义与使用,函数的定义 类型说明符 函数名() 声明部分 /老格式 语句 ,例:int max( int x,int y) return(xy?x:y); vo
3、id prt(char * strx) coutstr; ,第一节 函数的定义与使用,说明: 函数可以声明有某一种类型的返回值,也可以声明空返 回值(void),如不声明返回值,则默认类型是整形。 函数不允许嵌套定义,函数之间的关系是平行的。也就是说,在一个函数的函数体内, 不能再定义另一个函数。,第一节 函数的定义与使用,3、函数调用 函数调用的一般形式 函数名(实际参数表),注意: 实参的类型,个数,顺序都应与形参一致。 实参可以是常量、变量、表达式、函数等。必须有确定值。 参数的传值方式有传值和传地址两种方式,传地址为语言习惯,“晒太阳”,函数使用举例,1、缺省返回类型 max(floa
4、t x,float y) return(xy ?x:y); . Main() Coutmax(3.5,7.9)endl; 标准C中将返回值转换位整形 返回值由return语句实现,结果是?,2、嵌套调用:被调函数在执行的过程中又调用其它函数,3、递归调用:函数直接或间接的调用自身 如求 n! 、 汉诺塔,理解递归调用的实现过程,一个问题的递归可以分为“回退”和“递推”两个阶段。 构成递归的条件 递归结束条件及结束时的值; 能用递归形式表示,并且递归向终止条件发展。,4、传值与引用,引用:是某一变量(对象)的一个别名,对引用的操作与对变量直接操作完全一样。 声明方法:类型标识符 int /定义引
5、用ra,它是变量a的引用,即别名,关于引用:, int(,注意! 不同与指针,4、传值与引用,重点:传值、引用、指针的区别,引用的含义,int add(int x,int y) x=x+y; return x; ,int add(int *x,int y) * x= * x+y; return * x; ,int add(int ,int a,b; Add (a,b);,int a,b; int * p; p=,int a,b; Add (a,b);,调 用,返 回,第二节 内联函数,目的:提高程序运行效率 缺点:程序长度增大 可以看成是宏 内联函数 格式 inline 函数定义 说明:是否真
6、正是内联函数由编译器决定。 函数规模过大,编译器一般不作为内联函数处理 包含循环一般不当作内联函数,例:inline int add(int x,int y) return x+y; ,返 回,第三节 带默认值参数的函数,定义:在函数定义时可以预先给出参数的默认值 int sum_calc(int n,int i=1) int sum=0;int j; for(j=i;j=n;j+)sum+=j; return sum; ,注意: 默认的形参按自右到左的顺序定义 P80 在调用可以使用部分默认形参值,例: int add(int a=0,int b=2,int c=3,int d=4,int
7、e=5) return(a+b+c+d+e); ; void main() coutadd(1)endl; coutadd(1,9)endl; coutadd(1,9,8)endl; coutadd(1,9,3,7)endl; coutadd()endl;/不可以这样调用add( ,1); ,返 回,默认实参右侧不许出现具体实参!,第四节 函数重载,一、重载的含义:C+允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。,如:,注意事项:,重载函数的形参必须不同:个数不同或类型不同。 编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。,不能构
8、成重载,int add(int x,int y) return x+y; ,float add(float x,float y) return x-y; ,不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。,NO!,5.避免这样的重载:,void add(int a=0,int b=1) void add(); void main() add(); /error ambiguous call to overloaded function ,返 回,第五节 函数模板,函数模板的设计思想: 通用性,用一种形式适应普遍需要解决的问题。,如:由于数据类型的差异,设计一个求绝对值的函数可
9、能需要这样做:,int abs(int x)return(x0?x:-x); float abs(float x)return(x0?x:-x); Double ,函数模板定义 template (typename 自定义表示符) 函数定义,使用自定义表示符,template typeT abs(typeT x) Return (X0?x:-x); ,或者用class T!,模板的执行过程,程序实例: #include iostream.h template/或者template typeT abs(typeT X) return (X0?X:-X); void main() int x=-9; coutabs(x)endl; ,返 回,第五节 C+系统函数,类似C的库函数 查阅MSDN,返 回,