《函数类与对象》PPT课件.ppt
《《函数类与对象》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《函数类与对象》PPT课件.ppt(112页珍藏版)》请在三一办公上搜索。
1、第三章 函数、类与对象,第一节 C+的函数,1.函数原型,函数原型提供函数与编译器的界面,它告诉编译器:(1)函数返回值的类型(2)函数参数个数和类型,函数原型的一般语法形式为:返回类型 函数名(参数表);,例如:#include“iostream.h”int maxinum(int num1,int num2);main()int max,n1,n2;cinn1n2;max=maxinum(n1,n2);,coutn2)?n1:n2;return max;,说明:,(1)在程序中,要求一个函数的原型出现在该函数的调用语句之前。但当一个函数的定义在前,而对它的调用在后时,则不必给出原型。,(2
2、)函数原型的参数表中可不包含参数的名字,而只包含它们的类型。int maxinum(int,int);,(3)注意函数说明部分和函数原型的区别:参数,分号,(4)C+的参数说明必须放在函数名后的括号内,不可放在函数说明部分与函数体之间。,(5)主函数main()不必进行原型说明。,(6)原型中没有指出返回值的函数,C+默认该函数的返回类型是int。,(7)注意C和C+的区别:int f();C中:参数信息没有给出C+中:表示不带任何参数,与int f(void);等价,因为有了原型,使C+容易表达函数重载。,2.内联函数(inline),C+新增加的一个特性,以提高程序执行的速度。,调用一个函
3、数:(1)记录当前程序地址(2)将参数拷贝到堆栈中(3)转到存储器中记录的该函数地址(4)执行函数,将返回值存储在一寄存器中(5)离开该函数回到以前程序地址,C+处理对象时通过调用对象的公有成员函数来进行,函数调用比直接访问对象成员耗费更多的运行时间。,执行一个inline函数的方式是直接将该函数的程序码放入当初调用该inline函数的程序中。,例如:#include“iostream.h”#include“conio.h”inline double add(double x,double y)return(x+y);void main()cout“2+2 is:”add(2.0,2.0)en
4、dl;cout“2.2+3.134 is:”add(2.2,3.134)endl;cout“13.13+3.234 is:”add(13.13,3.234)endl;,经编译器编译后可视同:void main()cout“2+2 is:”2.0+2.0endl;cout“2.2+3.134 is:”2.2+3.134endl;cout“13.13+3.234 is:”13.13+3.234endl;,欲将一函数设定为inline函数,则必须完成以下两项工作:(1)在函数定义前加上关键字inline(2)该函数的定义必须在第一次被调用前出现,注意:inline函数不是宏命令#define squ
5、are(x)(x)*(x)调用时:int x=2;square(+x);编译器解释:(+x)*(+x),宏是属于文字替换,而inline函数是属于程序码上的替代,但观念上还是属于一般函数的用法。inline double square(double x)return(x*x);,因此可以说inline函数的使用要比宏来的稳定可靠多了。但通常只有较短的函数才定义为inline函数。,注意的几点:(1)内联函数必须在使用之前声明或定义。,#include int add(int a,int b);int main()int x=add(1,3);coutxendl;return 0;inline
6、int add(int x,int y)return x+y;,#include inline int add(int x,int y)return x+y;int main()int x=add(1,3);coutxendl;return 0;,(2)限制内联函数的大小。一般情况下,应控制在5行以内。,(3)内联函数的函数体内不能含有复杂的结构控制语句,如:switch和while,如果内联函数的函数体内有这些语句,则编译将该函数视同普通函数那样产生函数调用代码。,(4)递归函数不能被用来作为内联函数。,(5)若程序中有关键字register,则编译程序将忽略inline。,3.带缺省参数的
7、函数,C+允许在定义函数时给其中的某个或某些形式参数指定默认值,这样,当发生函数调用时,如果省略了对应位置上的实参的值时,则在执行被调函数时,以该形参的默认值进行运算。,#include void sum(int num=10)int i,s=0;for(i=1;i=num;i+)s=s+i;coutsum is sn;,void main()sum(100);sum();,注意事项:,(1)默认参数一般在函数说明中提供。如果程序中既有函数的说明又有函数的定义时,则定义函数时不允许再定义参数的默认值。如果程序中只有函数的定义,而没有说明函数,则默认参数才可出现在函数定义中。,void poin
8、t(int x=10,y=20);void main()void point(int x,int y)coutxendl;coutyendl;,(2)默认参数的顺序:如果一个函数中有多个默认参数时,则形参分布中,默认参数应从右至左逐渐定义。如:void myfunc(int a=1,float b,long c=20);/错误 void myfunc(int a,float b=2.1,long c=30);/正确,(3)缺省参数可以是常数,也可以是全局变量,甚至可以是一个函数调用,但决不能是一个局部变量。如:int a=1;int fun(int);int g(int x=fun(a);,4
9、.函数重载,函数重载是指一个函数可以和同一作用域中的其他函数具有相同的名字,但这些同名函数的参数类型、参数个数、返回值、函数功能可以完全不同。,#include void whatitis(int i)coutthis is an integer:iendl;void whatitis(char c)coutthis is a string:cendl;,main()int i=1;char c=abcdef;whatitis(i);whatitis(c);,注意事项:,(1)重载函数间不能只是函数的返回值不同,应至少在形参的个数、参数类型或参数顺序上有所不同。,void myfun(int
10、i)int myfun(int i)/这种重载是错误的。,(2)应使所有的重载函数的功能相同。如果让重载函数完成不同的功能,会破坏程序的可读性。,(3)用 typedef 定义的类型是一个已有类型的别名,而不是建立新的类型。,typedef int INT;void humbug(int x);void humbug(INT y);/error,(4)重载函数的使用要适度。,5.指向函数的指针,一个函数在内存中的起始地址就是该函数的指针。在C+中,函数的名称就代表了该函数的指针。指向函数的指针变量的一般定义形式为:返回值类型(*指针变量名)(参数表);,#include iostream.hi
11、nt max(int x,int y)int z;if(xy)z=x;else z=y;return(z);,void main()int(*p)(int,int);int a,b,c;p=max;cinab;c=p(a,b);coutc;,说明:(1)一个函数不能赋给一个不一致的函数指针。例:int*fn2(char x,char y);int(*fp1)(char a,char b);fp1=fn2;/error,(2)在函数指针变量赋值时,只须给出函数名,不能带参数,因为只是传递函数的地址。例:int(*fp)(int s);int fn(int a);fp=fn(3);/error,通
12、过指针调用所指向的函数:C中:(*p)(a,b);C+中:p(a,b);,(3)函数指针与其他数据类型的指针尽管都是地址,但在类型上有很大差别,两类指针之间不允许互相赋值。例:int*ip;void(*fp1)(char a,char b);fp1=ip;/error ip=fp1;/error,(4)对指向函数的指针做象p+n,p+,p-等算数运算是无意义的。,第二节 定义类,1.类的定义,类定义的一般形式为:class 类名private:数据成员或成员函数 protected:数据成员或成员函数 public:数据成员或成员函数;,class Tdate private:int mont
13、h;int day;int year;public:void Set(int,int,int);int IsLeapYear();void Print();,类的成员:数据成员和成员函数,数据封装:有条件地限制类中的成员被使用的状况。,说明:(1)private、protected和public可以按任意顺序出现任意次。,(2)数据成员可以是任何数据类型,但是不能用auto、register或extern进行说明。,(3)不能在类的声明中给数据成员赋值,C+规定,只有在类的对象定义之后才能给数据成员赋初值。,(4)不要忘了在类定义的第二个大括号“”之后加上一个分号。,2.类的实现,类的实现是指
14、成员函数的实现。有三种方式:,(1)类的定义和实现在同一个文件中,且都在类定义中完成;例1,(2)类的定义和实现在同一个文件中,函数的实现放在类外完成;,(3)类的定义和实现在不同文件中。,第一种方式是在类声明中只给出成员函数的原型,而成员函数体在类的外部定义。这种成员函数定义的一般形式是:返回类型 类名:函数名(参数表)函数体 详见例子,class Tdate private:int month;int day;int year;public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year
15、%4=0返回,class Tdate private:int month;int day;int year;public:void Set(int m,int d,int y);int IsLeapYear();void Print();,void Tdate:Set(int m,int d,int y)month=m;day=d;year=y;int Tdate:IsLeapYear()return(year%4=0,从这个例子可以看出,虽然函数Set(int,int)在类外部定义,但它们属于类Tdate的成员函数,它们可以直接使用类Tdate中的数据成员month,day和year。,说明
16、:,(1)在所定义的成员函数名之前应缀上类名,在类名和函数名之间应加上分隔符“:”,(2)在定义成员函数时,对函数所带的参数,不但要说明它的类型,还要指出其参数名。,(3)在定义成员函数时,其返回类型一定要与函数原型中声明的返回类型匹配。,成员函数的第二种定义方式是:将成员函数定义在类的内部,即定义为内置函数。在C+中,可以用下面两种格式定义类的内置函数:,(1)隐式定义:所谓内置函数的隐式定义,就是直接将函数定义在类内部。,(2)显式定义 在定义内置函数时,为了书写清晰,仍将它放在类定义体外。但为了使它仍然起内置函数的作用,在函数定义前冠以关键字inline,以此显式地说明这是一个内置函数。
17、,inline void Tdate:Set(int m,int d,int y)month=m;day=d;year=y;,例如:定义一个线性表类,#define elem char const int DefautListSize=100;class alist private:int maxSize,listSize;elem*listArray;public:alist(int size=DefaultListSize);alist();void create(int);void insert(const elem,alist:alist(int size)maxSize=size;l
18、istSize=0;listArray=new elemmaxSize;,alist:alist()delete listArray;,void alist:create(int n)listSize=n;for(int k=1;klistArrayk;,void alist:insert(const elemj-)listArrayj+1=listArrayj;listArrayi=x;listSize+;,void alist:delete(int i)int j;if(ilistSize)|(i0)cout(“error”);else for(j=i+1;j=listSize;j+)li
19、stArrayj-1=listArrayj;listSize-;,习题:设计一个链表类,能完成常见的初始化、建立链表、插入、删除、定位以及输出运算。,3.类的作用域,类是实现封装的工具,封装是通过public和private与成员函数实现的。private的成员构成类的内部状态,public的成员则构成与外界通信的接口,通过public的成员函数来使用private的数据成员,从而在C+中实现了封装。,类外不可见:私有数据私有函数原型私有函数和公有函数的实现,类外可见:公有数据公有函数原型,4.对象的定义,对象是类的实例,定义对象的一般格式为:类名 变量名表;或 类名 对象名;,例:class
20、 Tdate private:int month;int day;int year;public:void Set(int m,int d,int y);int IsLeapYear();void Print();Tdate date,classDate,sleepDate;Tdate date1;,类是抽象的概念,而对象是具体的,类只是一种数据类型,而对象是属于该类(数据类型)的一个变量,占用了各自的存储单元,每个对象各自具有了该类的一套数据成员(静态成员除外),而所有成员函数是所有对象共有的。每个对象的函数成员都通过指针指向同一个代码空间。,(1)访问对象的成员包括读写对象的数据成员和调用
21、它的成员函数,其访问格式是:对象名.公有数据对象名.公有成员函数名(实参表),例:date1.set(10,22,1980);,(2)通过说明一个指向对象的指针来访问公有成员函数,其访问格式是:指向对象的指针-公有的成员函数名(实参表)指向对象的指针-公有数据,5.访问对象成员,例:Tdate*p=,6.结构、联合和类,在C+中,存在三种类类型:类、结构和联合,它们分别使用三个关键字来声明和定义类:class、struct和union。,(1)在C+中,结构与类的唯一区别是:缺省时,结构的所有成员是公有的 类的所有成员是私有的,(2)在C+中,联合也是一种类,但联合的所有成员只能为公有成员,关
22、键字private和protected不能用于联合。,说明:,第三节 构造函数与析构函数,1.构造函数,构造函数(Constructor)定义了创建对象的方法,提供了初始化对象的一种简便手段。构造函数的说明格式为:();,例:class circle private:int center_x,center_y;double radius;public:circle(int x,int y,double r)radius=r;center_x=x;center_y=y;circle c1(0,1,5);,(4)在C+中,给对象的数据成员初始化的方法就是利用构造函数。,(5)C+规定,每个类必须有
23、一个构造函数。如果在类中没有显式定义构造函数时,则C+编译系统在编译时为该类提供一个默认的构造函数,该默认构造函数是个无参函数,它仅负责创建对象,而不做任何初始化工作。,(2)构造函数既可在类外定义,也可作为内联函数在类内定义,也允许重载。,(3)构造函数既可定义成有参函数,也可义成无参函数,要根据问题的需要来定。构造函数也可以有缺省参数,在使用时要防止二义性。,说明:(1)构造函数与类同名,且没有返回值类型。,class circle private:int center_x,center_y;double radius;public:circle(int x,int y,double r)
24、radius=r;center_x=x;center_y=y;circle(double r)radius=r;center_x=0;center_y=0;,2.析构函数,析构函数的定义方式为:类名()函数体,作用:用于执行一些清理任务。如释放分配给对 象的内存空间。,class circle private:int center_x,center_y;double radius;public:circle(int x,int y,double r);circle()cout“Destructor is active”;,(4)如果程序员在定义类时,没有为类提供析构函数,则系统会自动创建一个默
25、认的析构函数,其形式为:类名(),(2)没有返回值,没有参数,不能随意调用,也没有重载,只是在类对象生命期结束时,系统自动调用。,(3)在一个类中只能有一个析构函数。,说明:(1)析构函数与类同名,但它前面必须加上()。,(6)对象被析构的顺序与对象建立时的顺序正好相反。即最后构造的对象先被析构。,(5)对于一个简单的类来说,大多可以直接使用系统提供的默认析构函数。但是,如果在类的对象中分配有动态内存(如:用new申请分配的内容)时,就必须为该类提供适当的析构函数,完成清理工作。,include class A public:A()cout“In class A.n”;A()cout“Dest
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数类与对象 函数 对象 PPT 课件
链接地址:https://www.31ppt.com/p-5469910.html