《第五章 成员函数.ppt》由会员分享,可在线阅读,更多相关《第五章 成员函数.ppt(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章第五章 成员函数成员函数5.3.2 5.3.2 成员函数的调用成员函数的调用关于形参和实参的说明:关于形参和实参的说明:在函数定义时说明的形参,并不占内存中的存储单在函数定义时说明的形参,并不占内存中的存储单元。只有在函数调用时,形参才被分配内存单元,元。只有在函数调用时,形参才被分配内存单元,并被赋以实参的值。在调用结束后,该部分内存并被赋以实参的值。在调用结束后,该部分内存立刻被释放。立刻被释放。实参可以是常量、变量、或表达式等,但要求它们实参可以是常量、变量、或表达式等,但要求它们必须有必须有确定确定的值。的值。函数指针的声明函数指针的声明正确的指针类型声明如下:正确的指针类型声明
2、如下:返回值类型返回值类型 (*(*函数指针名函数指针名)(参数表参数表););例如:例如:intint(*(*func_p)(charfunc_p)(char a,char b);a,char b);5.3.3.15.3.3.1函数指针函数指针5.5.4 5.5.4 递归递归函数的自我调用函数的自我调用所谓所谓“递归递归”是指通过重复执行相同的计算来解是指通过重复执行相同的计算来解决问题。即函数直接或间接地自己调用自己。编写递归决问题。即函数直接或间接地自己调用自己。编写递归程序的关键是:程序的关键是:(1)(1)构造递归表达式。构造递归表达式。将将n n阶的问题转化为比阶的问题转化为比n
3、n阶小的阶小的问题,转化以后的问题与原来的问题的解法是相同的。问题,转化以后的问题与原来的问题的解法是相同的。(2)(2)必须寻找一个明确的递归结束条件,称为递归出必须寻找一个明确的递归结束条件,称为递归出口。口。5.65.6函数的参数的传递机制函数的参数的传递机制 当一个函数定义有形参时,在进行函数调用时,当一个函数定义有形参时,在进行函数调用时,当一个函数定义有形参时,在进行函数调用时,当一个函数定义有形参时,在进行函数调用时,必须提供与形参个数相同、顺序相同、类型相同必须提供与形参个数相同、顺序相同、类型相同必须提供与形参个数相同、顺序相同、类型相同必须提供与形参个数相同、顺序相同、类型
4、相同的实参;或通过类型转换能够将实参的值映射为的实参;或通过类型转换能够将实参的值映射为的实参;或通过类型转换能够将实参的值映射为的实参;或通过类型转换能够将实参的值映射为形参类型的值。形参类型的值。形参类型的值。形参类型的值。在在在在C C C C中,可以使用两种传递机制将实参的值中,可以使用两种传递机制将实参的值中,可以使用两种传递机制将实参的值中,可以使用两种传递机制将实参的值传递给形参:传递给形参:传递给形参:传递给形参:一种被称为值传递一种被称为值传递一种被称为值传递一种被称为值传递 (值调用)。(值调用)。(值调用)。(值调用)。另一种被称为引用传递(引用调用)。另一种被称为引用传
5、递(引用调用)。另一种被称为引用传递(引用调用)。另一种被称为引用传递(引用调用)。5.6.15.6.1传值调用传值调用C+C+中变量的值有两种:变量本身值和变量地址值。中变量的值有两种:变量本身值和变量地址值。1.1.传值调用的特点:传值调用的特点:调用时系统先计算实参表达式的值,然后依次赋给调用时系统先计算实参表达式的值,然后依次赋给形参。因此,传值调用的实现机制是系统将实参拷贝一形参。因此,传值调用的实现机制是系统将实参拷贝一个副本给形参。在被调用的函数中参数(即参数的副本)个副本给形参。在被调用的函数中参数(即参数的副本)被改变,但未改变实参的值(即不能被改变,但未改变实参的值(即不能
6、“回带回带”)。)。5.6.15.6.1传值调用传值调用2 2 2 2.传址调用的特点传址调用的特点 使用传址调用方式时,调用函数的实参是某个变使用传址调用方式时,调用函数的实参是某个变量的地址值,被调用的函数的形参是指针(变量的指量的地址值,被调用的函数的形参是指针(变量的指针或类类型的变量的指针)。针或类类型的变量的指针)。5.6.25.6.2引用调用引用调用 使用引用作为函数的形参时,调用函数的实使用引用作为函数的形参时,调用函数的实使用引用作为函数的形参时,调用函数的实使用引用作为函数的形参时,调用函数的实参要用变量名参要用变量名参要用变量名参要用变量名,将实参的变量名传给形参的引,将
7、实参的变量名传给形参的引,将实参的变量名传给形参的引,将实参的变量名传给形参的引用,相当于在被调用函数中使用了实参的别名。用,相当于在被调用函数中使用了实参的别名。用,相当于在被调用函数中使用了实参的别名。用,相当于在被调用函数中使用了实参的别名。5.7.35.7.3带缺省值的函数带缺省值的函数 C+C+C+C+语言允许语言允许语言允许语言允许在函数的原型中在函数的原型中在函数的原型中在函数的原型中(若没有说明函数(若没有说明函数(若没有说明函数(若没有说明函数的原型,则应在函数定义时),给一个或多个参数指的原型,则应在函数定义时),给一个或多个参数指的原型,则应在函数定义时),给一个或多个参
8、数指的原型,则应在函数定义时),给一个或多个参数指定默认值。但是,定默认值。但是,定默认值。但是,定默认值。但是,在指定了默认值的参数在指定了默认值的参数在指定了默认值的参数在指定了默认值的参数右边不能出右边不能出右边不能出右边不能出现没有指定默认值的参数现没有指定默认值的参数现没有指定默认值的参数现没有指定默认值的参数。如:如:如:如:正确的带缺省值函数的原型是:正确的带缺省值函数的原型是:正确的带缺省值函数的原型是:正确的带缺省值函数的原型是:void void void void f_af_af_af_a(intintintint x,x,x,x,intintintint y=8,y=8
9、,y=8,y=8,intintintint z=9);z=9);z=9);z=9);错误的带缺省值函数的原型是:错误的带缺省值函数的原型是:错误的带缺省值函数的原型是:错误的带缺省值函数的原型是:voidvoidvoidvoid f_af_af_af_a(intintintint x=5,x=5,x=5,x=5,intintintint y,y,y,y,intintintint z=6);z=6);z=6);z=6);voidvoidvoidvoid f_af_af_af_a(intintintint x=5,x=5,x=5,x=5,intintintint y=6,y=6,y=6,y=6,i
10、ntintintint z);z);z);z);5.8 5.8 静态成员函数静态成员函数 为了在不生成类对象的情况下,直接访问静态数据为了在不生成类对象的情况下,直接访问静态数据成员,成员,C+C+定义了静态成员函数的概念。定义了静态成员函数的概念。定义静态成员函数的格式如下:定义静态成员函数的格式如下:static static 返回值类型返回值类型 成员函数名成员函数名(参数列表参数列表);在静态成员函数中所引用的数据,可以是以下两种类型:在静态成员函数中所引用的数据,可以是以下两种类型:直接引用:直接引用:类中的静态数据成员;类中的静态数据成员;全局数据变量;全局数据变量;用用const
11、const关键字说明的常量;关键字说明的常量;5.8 5.8 静态成员函数静态成员函数 间接引用:间接引用:类中的非静态数据成员,可以通过该类的对象间接引用类中的非静态数据成员,可以通过该类的对象间接引用。如下例:。如下例:intint ex=6;ex=6;const const intint cxcx=7;=7;class class MyclassMyclass public:public:static static intint f_1(f_1(MyclassMyclass m);/m);/静态成员函数静态成员函数intint x;x;/非静态数据成员非静态数据成员static stat
12、ic intint y y;/静态数据成员静态数据成员 ;intint Myclass:yMyclass:y=8;=8;intint Myclass:f_1(Myclass:f_1(MyclassMyclass m)m)m.xm.x=9;=9;return y+ex+return y+ex+cxcx+m.xm.x;函数的调用结果是:返回值函数的调用结果是:返回值 =30=30 5.8 5.8 静态成员函数静态成员函数访问静态成员函数的方法有如下几种:访问静态成员函数的方法有如下几种:方法方法 类名类名:静态成员函数名静态成员函数名方法方法 对象名对象名.静态成员函数名静态成员函数名方法方法 对
13、象指针对象指针 -静态成员函数名静态成员函数名5.10.2 5.10.2 析构函数析构函数 析构函数的作用是析构函数的作用是用来完成对象被用来完成对象被删除前的清理工作的删除前的清理工作的。通常,析构函数。通常,析构函数是在对象的生存期即将结束时,由系统是在对象的生存期即将结束时,由系统自动调用的自动调用的。随后这个对象就消失了,。随后这个对象就消失了,对象所占的内存空间也被释放了。对象所占的内存空间也被释放了。5.10.2 5.10.2 析构函数析构函数定义析构函数原型的一般格式为:定义析构函数原型的一般格式为:定义析构函数原型的一般格式为:定义析构函数原型的一般格式为:析构函数名();析构
14、函数名();析构函数名();析构函数名();class class class class MyclassMyclassMyclassMyclass private:private:private:private:intintintint x;x;x;x;intintintint y;y;y;y;A*pa;A*pa;A*pa;A*pa;public:public:public:public:MyclassMyclassMyclassMyclass(intintintint a,float b)x=a;y=b;a,float b)x=a;y=b;a,float b)x=a;y=b;a,float
15、 b)x=a;y=b;Myclass(intMyclass(intMyclass(intMyclass(int a)x=a;pa=new A;a)x=a;pa=new A;a)x=a;pa=new A;a)x=a;pa=new A;MyclassMyclassMyclassMyclass()()()()MyclassMyclassMyclassMyclass()delete pa;()delete pa;()delete pa;()delete pa;定义类对象如下:定义类对象如下:定义类对象如下:定义类对象如下:MyclassMyclassMyclassMyclass m1(5,6);m1(5,6);m1(5,6);m1(5,6);MyclassMyclassMyclassMyclass m2(8);m2(8);m2(8);m2(8);MyclassMyclassMyclassMyclass m3;m3;m3;m3;
限制150内