《面向对象的编程方法精选文档.ppt》由会员分享,可在线阅读,更多相关《面向对象的编程方法精选文档.ppt(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象的编程方法面向对象的编程方法1本讲稿第一页,共六十三页本讲主要内容本讲主要内容l面向对象的思想面向对象的思想lOOP的基本特点的基本特点l类类l构造函数构造函数l析构函数析构函数l对象对象l内联成员函数内联成员函数l拷贝构造函数拷贝构造函数l聚集的概念聚集的概念2本讲稿第二页,共六十三页回顾:面向过程的设计方法回顾:面向过程的设计方法l重点放在如何实现细节过程方面,将数重点放在如何实现细节过程方面,将数据与函数分开。据与函数分开。l形式:主模块形式:主模块+若干个子模块若干个子模块(main()+子函数)。子函数)。l特点:特点:自顶向下,逐步求精自顶向下,逐步求精功能分解。功能分解。
2、l缺点:效率低,是手工作坊式的编程。缺点:效率低,是手工作坊式的编程。面向对象的思想3本讲稿第三页,共六十三页面向对象的方法面向对象的方法l观点:自然界是由实体(对象)所组观点:自然界是由实体(对象)所组成。成。l程序设计方法:使用面向对象的观点程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。来描述模仿并处理现实问题。l要求:高度概括、分类和抽象。要求:高度概括、分类和抽象。l目的:实现软件设计的产业化。目的:实现软件设计的产业化。面向对象的思想4本讲稿第四页,共六十三页抽象抽象抽象是对具体对象(问题)进行概括,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述抽出
3、这一类对象的公共性质并加以描述的过程。的过程。先注意问题的本质及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。代码抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:通过类的定义。OOP的基本特点5本讲稿第五页,共六十三页抽象抽象l实例一:窗口实例一:窗口数据抽象:int x1,y1,x2,y2,color代码抽象:OpenWindow(),CloseWindow(),MoveWindow(),ChangeWindow()l实例二:钟表实例二:钟表数据抽象:int Hour,int Minute,int Second代码抽象:SetTime()
4、,ShowTime()OOP的基本特点6本讲稿第六页,共六十三页抽象抽象l实例三:人实例三:人数据抽象:char*name,char*sex,int age,int id代码抽象:生物属性角度:GetCloth(),EatFood(),GoHome(),Sleep()社会属性角度:AddPerson(),DeletePerson(),PrintData(),Change()OOP的基本特点7本讲稿第七页,共六十三页封装封装将抽象出的数据成员、代码成员相结将抽象出的数据成员、代码成员相结合,将它们视为一个整体。合,将它们视为一个整体。目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只
5、需要通过外部接口,以特定的访问权限,来使用类的成员。实现封装:类定义中的OOP的基本特点8本讲稿第八页,共六十三页封装封装l实例:实例:class Watch public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;边界外部接口特定的访问权限OOP的基本特点9本讲稿第九页,共六十三页继承与派生继承与派生是是C+中支持层次分类的一种机制,中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,允许程序员在保持原有类特性的基础上,进行更具体的类定义。进行更具体
6、的类定义。实现:定义派生类。实现:定义派生类。OOP的基本特点10本讲稿第十页,共六十三页多态性多态性l多态:同一名称,不同的功能实现方多态:同一名称,不同的功能实现方式。式。l目的:达到行为标识统一,减少程序目的:达到行为标识统一,减少程序中标识符的个数。中标识符的个数。l实现:重载函数和虚函数。实现:重载函数和虚函数。OOP的基本特点11本讲稿第十一页,共六十三页c+中的类中的类l类是类是OOP的精华,利用它可以实现数的精华,利用它可以实现数据的封装、隐藏、继承与派生。据的封装、隐藏、继承与派生。l利用类可以编写大型复杂程序,其模利用类可以编写大型复杂程序,其模块化程度比块化程度比C中采用
7、函数更高。中采用函数更高。类 和 对 象12本讲稿第十二页,共六十三页类的定义类的定义 类是一种用户自定义类型,定义形式:类是一种用户自定义类型,定义形式:class 类名称 public:外部接口 protected:保护型成员 private:私有成员类 和 对 象13本讲稿第十三页,共六十三页类的成员类的成员l成员数据成员数据与一般的变量定义相同,但需要将它放在类的定义体中。l成员函数成员函数在类中说明原形,在类外定义函数体实现,并在函数名前使用类名加以限定。也可以直接在类中定义函数体,形成内联成员函数。允许定义重载函数和带缺省形参值的函数类 和 对 象14本讲稿第十四页,共六十三页类成
8、员的访问控制属性类成员的访问控制属性 在类中可以包含以下三种类型的数据在类中可以包含以下三种类型的数据和函数成员:和函数成员:l私有类型(私有类型(private)l公有类型(公有类型(public)l保护类型(保护类型(protected)类 和 对 象15本讲稿第十五页,共六十三页类的定义举例类的定义举例class one_datum int data_store;public:void set(int in_value);int get_value(void);void one_datum:set(int in_value)data_store=in_value;int one_datu
9、m:get_value(void)return data_store;类 和 对 象19本讲稿第十九页,共六十三页内联成员函数内联成员函数l在类中声明的成员函数可以采用两种在类中声明的成员函数可以采用两种方式使其成为内联函数方式使其成为内联函数将函数体放在类的声明中。使用inline关键字。类 和 对 象20本讲稿第二十页,共六十三页内联成员函数举例内联成员函数举例class Location public:void Init(int initX,int initY)X=initX;Y=initY;int GetX()return X;int GetY()return Y;private:in
10、t X,Y;类 和 对 象21本讲稿第二十一页,共六十三页对象对象类的对象是具有该类类型的某一特定类的对象是具有该类类型的某一特定实体,即该类型的变量。实体,即该类型的变量。定义形式:定义形式:类名类名 对象名;对象名;例:例:watch myWatch;类 和 对 象22本讲稿第二十二页,共六十三页类中成员的访问方式类中成员的访问方式l类中成员互访类中成员互访直接使用成员名l类外访问类外访问使用“对象名.成员名”方式访问 public 属性的成员类 和 对 象23本讲稿第二十三页,共六十三页类的应用举例类的应用举例#includeclass Watch public:void SetTime
11、(int NewH=0,int NewM=0,int NewS=0);void ShowTime();private:int Hour,Minute,Second;类 和 对 象24本讲稿第二十四页,共六十三页类的应用举例类的应用举例/时钟类成员函数的实现时钟类成员函数的实现void Watch:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;inline void Watch:ShowTime()coutHour:Minute:Second;类 和 对 象25本讲稿第二十五页,共六十三页类的应用举例类的
12、应用举例/主函数主函数void main(void)Watch myWatch;/定义对象定义对象 myWatch.SetTime();/按默认值设置按默认值设置 myWatch.ShowTime();myWatch.SetTime(8,30,30);myWatch.ShowTime();类 和 对 象26本讲稿第二十六页,共六十三页构造函数构造函数l以上例中定义了一个以上例中定义了一个SetTime()成员成员函数。调用这个函数可以给对象设置函数。调用这个函数可以给对象设置时间。时间。l构造函数也有类似的功能:给对象赋构造函数也有类似的功能:给对象赋初值。但构造函数是在定义对象时由初值。但构
13、造函数是在定义对象时由系统自动调用的。系统自动调用的。构造函数和析构函数27本讲稿第二十七页,共六十三页构造函数构造函数l构造函数的作用是在对象被创建时使构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象用特定的值构造对象,或者说将对象初始化为一个特定的状态。初始化为一个特定的状态。l在对象创建时由系统自动调用。在对象创建时由系统自动调用。l如果程序中未定义出,则系统自动产如果程序中未定义出,则系统自动产生出一个缺省形式的构造函数生出一个缺省形式的构造函数l允许为内联函数、重载函数、带缺省允许为内联函数、重载函数、带缺省形参值的函数形参值的函数构造函数和析构函数28本讲稿第二十八
14、页,共六十三页构造函数(例)构造函数(例)class watch public:watch(int initH,int initM,int initS);/构造函数 void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;构造函数和析构函数29本讲稿第二十九页,共六十三页构造函数(例)构造函数(例)/实现构造函数watch:watch(int initH,int initM,int initS)Hour=initH;Minute=initM;Second=initS;构造函数
15、和析构函数30本讲稿第三十页,共六十三页构造函数(例)构造函数(例)/主函数void main(void)watch myWatch(05,06,07);/定义对象定义对象 watch watch01(03,04,05);myWatch.SetTime();/按默认值设置按默认值设置 myWatch.ShowTime();coutendl;myWatch.SetTime(8,30,30);myWatch.ShowTime();coutendl;watch01.ShowTime();coutendl;构造函数和析构函数31本讲稿第三十一页,共六十三页构造函数构造函数l构造函数的名字一定和类的名字
16、相同。构造函数的名字一定和类的名字相同。l构造函数没有返回值;函数也没有类构造函数没有返回值;函数也没有类型。型。l构造函数主要是两个功能:为对象开辟空间,构造函数主要是两个功能:为对象开辟空间,为对象中的数据成员赋初值。为对象中的数据成员赋初值。l如果没有定义构造函数,编译系统会自动生成一如果没有定义构造函数,编译系统会自动生成一个确省的构造函数。个确省的构造函数。构造函数和析构函数32本讲稿第三十二页,共六十三页构造函数构造函数l对上例中构造函数的默认构造函数是:对上例中构造函数的默认构造函数是:watch:watch()l只能用来设置对象的存储空间,不能赋初值。只能用来设置对象的存储空间
17、,不能赋初值。构造函数和析构函数33本讲稿第三十三页,共六十三页构造函数构造函数l含有确省参数的构造函数:含有确省参数的构造函数:class watch public:watch(int initH=0,int initM=0,int initS=0);/含有缺省参数含有缺省参数构造函数构造函数 void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;构造函数和析构函数34本讲稿第三十四页,共六十三页构造函数构造函数l含有确省参数的构造函数:含有确省参数的构造函数:lvoid
18、 main(void)l l watch myWatch;/按按缺缺省值定义对象省值定义对象l watch watch01(8,7);/只传递一个参数只传递一个参数l watch watch01(03,04,05);ll注:注:缺缺省值不能在构造函数实现时规定。省值不能在构造函数实现时规定。构造函数和析构函数35本讲稿第三十五页,共六十三页拷贝构造函数拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参为本类的拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。对象引用。class 类名 public:类名(形参);/构造函数 类名(类名&对象名);/拷贝构造函数 .;类名:类名(类名&
19、对象名)/拷贝构造函数的实现 函数体 构造函数和析构函数36本讲稿第三十六页,共六十三页拷贝构造函数拷贝构造函数class Location public:Location(int xx=0,int yy=0)X=xx;Y=yy;Location(Location&p);int GetX()return X;int GetY()return Y;private:int X,Y;构造函数和析构函数37本讲稿第三十七页,共六十三页Location:Location(Location&p)X=2*p.X;Y=2*p.Y;cout拷贝构造函数被调用拷贝构造函数被调用endl;本讲稿第三十八页,共六十三
20、页拷贝构造函数拷贝构造函数l当用类的一个对象去初始化该类的另一个当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现拷贝赋值。对象时系统自动调用它实现拷贝赋值。例:int main(void)Location C;/按默认值定义 Location A(1,2);Location B(A);/拷贝构造函数被调用 coutB.GetX()“B.GetY()endl;return 0;构造函数和析构函数39本讲稿第三十九页,共六十三页拷贝构造函数拷贝构造函数l执行结果:执行结果:拷贝构造函数被调用拷贝构造函数被调用2 4构造函数和析构函数40本讲稿第四十页,共六十三页拷贝构造函数拷贝构造函数
21、l若函数的形参为类对象,调用函数时,若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝实参赋值给形参,系统自动调用拷贝构造函数。例如:构造函数。例如:void f(Location p)coutp.GetX()endl;int main()Location A(3,4);f(A);/调用拷贝构造函数 return 0;构造函数和析构函数41本讲稿第四十一页,共六十三页拷贝构造函数拷贝构造函数l执行时,调用拷贝构造函数,将对象执行时,调用拷贝构造函数,将对象A拷贝到形参拷贝到形参p,然后再执行函数,然后再执行函数f。l执行结果:执行结果:拷贝构造函数被调用拷贝构造函数被调用6 构
22、造函数和析构函数42本讲稿第四十二页,共六十三页拷贝构造函数拷贝构造函数l当函数的返回值是类对象时,系统自动调用拷贝构当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:造函数。例如:Location g()Location A(1,2);return A;/调用拷贝构造函数int main()Location B;B=g();return 0;构造函数和析构函数43本讲稿第四十三页,共六十三页拷贝构造函数拷贝构造函数如果程序员没有为类声明拷贝初始如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷化构造函数,则编译器自己生成一个拷贝构造函数。贝构造函数。这个构造函数执行的功
23、能是:用作这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。初始化将要建立的对象的对应数据成员。构造函数和析构函数44本讲稿第四十四页,共六十三页析构函数析构函数l完成对象被删除前的一些清理工作。完成对象被删除前的一些清理工作。l在对象的生存期结束的时刻系统自动在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空调用它,然后再释放此对象所属的空间。间。l如果程序中未定义析构函数,编译器如果程序中未定义析构函数,编译器将自动产生一个缺省的析构函数。将自动产生一个缺省的析构函数。构造函数和析构函数45本
24、讲稿第四十五页,共六十三页构造函数和析构函数举例构造函数和析构函数举例#includeclass Location public:Location(int xx,int yy);Location();/.其它函数原形其它函数原形 private:int X,int Y;构造函数和析构函数46本讲稿第四十六页,共六十三页Location:Location(int xx,int yy)X=xx;Y=yy;Location:Location()/.其它函数的实现略其它函数的实现略本讲稿第四十七页,共六十三页构造初始化表构造初始化表l构造函数也可使用构造初始化表对数据成构造函数也可使用构造初始化表对数
25、据成员进行初始化:员进行初始化:l如:如:Circle:Circle(float r)radius=r;l可改写为:可改写为:Circle:Circle(float r):radius(r)构造函数和析构函数48本讲稿第四十八页,共六十三页构造初始化表构造初始化表l又如:又如:class A int i;float f;public:A(int X,float Y)i=X;f=Y;构造函数和析构函数l相当于:相当于:class A int i;float f;public:A(int X,float Y):i(X),f(Y);49本讲稿第四十九页,共六十三页聚集的概念聚集的概念l类中的类中的成
26、员数据成员数据是另一个类的对象。是另一个类的对象。l可以在已有的抽象的基础上实现更复可以在已有的抽象的基础上实现更复杂的抽象。杂的抽象。类 的 聚 集50本讲稿第五十页,共六十三页举例举例class Point private:int x,y;/点的坐标 public:Point(int xx=0,int yy=0)x=xx;y=yy;/构造函数 Point(Point&p);int GetX()return x;/取X坐标 int GetY()return y;/取Y坐标;类 的 聚 集51本讲稿第五十一页,共六十三页/拷贝构造函数的实现拷贝构造函数的实现Point:Point(Point&
27、p)x=p.x;y=p.y;coutp.x;coutPoint 拷贝构造函数被调用拷贝构造函数被调用endl;本讲稿第五十二页,共六十三页/类的聚集,类的聚集,Distance类的定义类的定义class Distancepublic:Distance(Point xp1,Point xp2);double GetDis()return dist;private:Point p1,p2;double dist;/Distance类以两个类的对象类以两个类的对象p1,p2为成员数据。为成员数据。/构造函数以两个类的对象构造函数以两个类的对象xp1、xp2作为形式参数作为形式参数本讲稿第五十三页,共
28、六十三页/类的聚集的构造函数类的聚集的构造函数Distance:Distance(Point xp1,Point xp2):p1(xp1),p2(xp2)coutDistance的构造函数被调用的构造函数被调用endl;double x=double(p1.GetX()-p2.GetX();double y=double(p1.GetY()-p2.GetY();dist=sqrt(x*x+y*y);/x和和y是函数的局部变量,和是函数的局部变量,和Point类的成员无关。类的成员无关。/sqrt是求平方根函数,要使用是求平方根函数,要使用math.h头文件头文件本讲稿第五十四页,共六十三页/主
29、函数主函数void main()Point myp1(1,1),myp2(4,5);Distance myd(myp1,myp2);coutThe distance is:;coutmyd.GetDis()endl;/在生成在生成myd对象时,生成两个对象对象时,生成两个对象myp2和和myp1/再将它们作为实在参数传递给构造函数再将它们作为实在参数传递给构造函数Distance本讲稿第五十五页,共六十三页/运行结果运行结果4 Point 拷贝构造函数被调用1 Point 拷贝构造函数被调用1 Point 拷贝构造函数被调用4 Point 拷贝构造函数被调用Distance的构造函数被调用Th
30、e distance is:5l/本讲稿第五十六页,共六十三页class Line private:point p1,p2;/线段的两个端点线段的两个端点 public:Line(Point a,Point b);/构造函数构造函数 Void Draw(void);/画出线段画出线段;/.函数的实现略函数的实现略本讲稿第五十七页,共六十三页类聚集的构造函数设计类聚集的构造函数设计l原则:不仅要负责对本类中的基本类型成原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。员数据赋初值,也要对对象成员初始化。l定义形式:定义形式:类名:类名(对象成员所需的形参,本类成员形参):对
31、象1(参数),对象2(参数),.本类初始化 类 的 聚 集58本讲稿第五十八页,共六十三页类聚集的构造函数调用类聚集的构造函数调用l构造函数调用顺序:先调用内嵌子对构造函数调用顺序:先调用内嵌子对象的构造函数(按内嵌时的定义顺序,象的构造函数(按内嵌时的定义顺序,先定义者先构造)。然后调用本类的先定义者先构造)。然后调用本类的构造函数。(析构函数的调用顺序相构造函数。(析构函数的调用顺序相反)反)l若调用缺省构造函数(即无形参的),若调用缺省构造函数(即无形参的),则子对象的初始化也将调用相应的缺则子对象的初始化也将调用相应的缺省构造函数。省构造函数。类 的 聚 集59本讲稿第五十九页,共六十
32、三页前向引用声明前向引用声明l类应该先声明,后使用类应该先声明,后使用l如果需要在某个类的定义之前,引用如果需要在某个类的定义之前,引用该类,则应进行前向引用声明。该类,则应进行前向引用声明。l前向引用声明只为程序引入一个标识前向引用声明只为程序引入一个标识符,但具体声明在其它地方。符,但具体声明在其它地方。60本讲稿第六十页,共六十三页类模板定义及用途类模板定义及用途template 类声明类声明使用类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括系统预定义的和用户自定义的)。类 模 板61本讲稿第六十一页,共六十三页#i
33、fndef TEMPLATE_STORE_CLASS#define TEMPLATE_STORE_CLASS#include /头文件头文件store.h#include template/类模板类模板class Storeprivate:T item;int haveValue;public:Store(void);/构造函数构造函数 T GetElement(void);/函数类型为函数类型为T void PutElement(T x);/函数形参类型函数形参类型T;本讲稿第六十二页,共六十三页#include/主函数文件主函数文件#include store.h#include student.hvoid main(void)Student graduate=1000,30;Store A,B;Store S;Store D;A.PutElement(3);B.PutElement(-7);coutA.GetElement()B.GetElement();S.PutElement(graduate);cout endl The student id is”S.GetElement().studIDendl;coutRetrieving object D;coutD.GetElement()endl;本讲稿第六十三页,共六十三页
限制150内