面向对象的编程方法_第1页
面向对象的编程方法_第2页
面向对象的编程方法_第3页
面向对象的编程方法_第4页
面向对象的编程方法_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

面向对象的编程方法1第1页,共63页,2023年,2月20日,星期四本讲主要内容面向对象的思想OOP的基本特点类构造函数析构函数对象内联成员函数拷贝构造函数聚集的概念2第2页,共63页,2023年,2月20日,星期四回顾:面向过程的设计方法重点放在如何实现细节过程方面,将数据与函数分开。形式:主模块+若干个子模块

(main()+子函数)。特点:

自顶向下,逐步求精——功能分解。缺点:效率低,是手工作坊式的编程。面向对象的思想3第3页,共63页,2023年,2月20日,星期四面向对象的方法观点:自然界是由实体(对象)所组成。程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。要求:高度概括、分类和抽象。目的:实现软件设计的产业化。面向对象的思想4第4页,共63页,2023年,2月20日,星期四抽象抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。先注意问题的本质及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。代码抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:通过类的定义。OOP的基本特点5第5页,共63页,2023年,2月20日,星期四抽象实例一:窗口数据抽象:intx1,y1,x2,y2,color代码抽象:OpenWindow(),CloseWindow(),

MoveWindow(),ChangeWindow()实例二:钟表数据抽象:intHour,intMinute,intSecond代码抽象:SetTime(),ShowTime()OOP的基本特点6第6页,共63页,2023年,2月20日,星期四抽象实例三:人数据抽象:char*name,char*sex,intage,intid代码抽象:

生物属性角度:

GetCloth(),EatFood(),GoHome(),Sleep()

社会属性角度:

AddPerson(),DeletePerson(),PrintData(),Change()OOP的基本特点7第7页,共63页,2023年,2月20日,星期四封装将抽象出的数据成员、代码成员相结合,将它们视为一个整体。目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。实现封装:类定义中的{}OOP的基本特点8第8页,共63页,2023年,2月20日,星期四封装实例:classWatch{public:voidSetTime(intNewH,intNewM,

intNewS);

voidShowTime();private:intHour,Minute,Second;};边界外部接口特定的访问权限OOP的基本特点9第9页,共63页,2023年,2月20日,星期四继承与派生是C++中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的类定义。实现:定义派生类。OOP的基本特点10第10页,共63页,2023年,2月20日,星期四多态性多态:同一名称,不同的功能实现方式。目的:达到行为标识统一,减少程序中标识符的个数。实现:重载函数和虚函数。OOP的基本特点11第11页,共63页,2023年,2月20日,星期四c++中的类类是OOP的精华,利用它可以实现数据的封装、隐藏、继承与派生。利用类可以编写大型复杂程序,其模块化程度比C中采用函数更高。类和对象12第12页,共63页,2023年,2月20日,星期四类的定义类是一种用户自定义类型,定义形式:class类名称{

public:外部接口protected:保护型成员private:私有成员}类和对象13第13页,共63页,2023年,2月20日,星期四类的成员成员数据与一般的变量定义相同,但需要将它放在类的定义体中。成员函数在类中说明原形,在类外定义函数体实现,并在函数名前使用类名加以限定。也可以直接在类中定义函数体,形成内联成员函数。允许定义重载函数和带缺省形参值的函数类和对象14第14页,共63页,2023年,2月20日,星期四类成员的访问控制属性在类中可以包含以下三种类型的数据和函数成员:私有类型(private)公有类型(public)保护类型(protected)类和对象15第15页,共63页,2023年,2月20日,星期四私有类型成员在关键字private后面声明,如果省略关键字private,那么必须紧跟在类型名称的后面声明。私有类型的成员只允许本类中的函数访问,而类外部的任何函数都不能访问。类和对象16第16页,共63页,2023年,2月20日,星期四公有类型成员在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。类和对象17第17页,共63页,2023年,2月20日,星期四保护类型与private类似,其差别表现在继承与派生时对派生类的影响不同,稍后再讲。类和对象18第18页,共63页,2023年,2月20日,星期四类的定义举例classone_datum{intdata_store;public:voidset(intin_value);intget_value(void);};voidone_datum::set(intin_value){data_store=in_value;}intone_datum::get_value(void){returndata_store;}类和对象19第19页,共63页,2023年,2月20日,星期四内联成员函数在类中声明的成员函数可以采用两种方式使其成为内联函数将函数体放在类的声明中。使用inline关键字。类和对象20第20页,共63页,2023年,2月20日,星期四内联成员函数举例classLocation{public:voidInit(intinitX,intinitY)

{X=initX;Y=initY;}intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};类和对象21第21页,共63页,2023年,2月20日,星期四对象类的对象是具有该类类型的某一特定实体,即该类型的变量。定义形式:类名对象名;例:

watchmyWatch;类和对象22第22页,共63页,2023年,2月20日,星期四类中成员的访问方式类中成员互访直接使用成员名类外访问使用“对象名.成员名”方式访问

public

属性的成员类和对象23第23页,共63页,2023年,2月20日,星期四类的应用举例#include<iostream.h>classWatch{public:

voidSetTime(intNewH=0, intNewM=0,intNewS=0);

voidShowTime();private:intHour,Minute,Second;};类和对象24第24页,共63页,2023年,2月20日,星期四类的应用举例//时钟类成员函数的实现voidWatch::SetTime(intNewH,intNewM,

intNewS){Hour=NewH;Minute=NewM;Second=NewS;}inlinevoidWatch::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}类和对象25第25页,共63页,2023年,2月20日,星期四类的应用举例//主函数voidmain(void){WatchmyWatch; //定义对象myWatch.SetTime();//按默认值设置myWatch.ShowTime();myWatch.SetTime(8,30,30);myWatch.ShowTime();}类和对象26第26页,共63页,2023年,2月20日,星期四构造函数以上例中定义了一个SetTime()成员函数。调用这个函数可以给对象设置时间。构造函数也有类似的功能:给对象赋初值。但构造函数是在定义对象时由系统自动调用的。构造函数和析构函数27第27页,共63页,2023年,2月20日,星期四构造函数构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。在对象创建时由系统自动调用。如果程序中未定义出,则系统自动产生出一个缺省形式的构造函数允许为内联函数、重载函数、带缺省形参值的函数构造函数和析构函数28第28页,共63页,2023年,2月20日,星期四构造函数(例)classwatch{public:

watch(intinitH,intinitM,intinitS);//构造函数voidSetTime(intNewH, intNewM,intNewS);

voidShowTime();private:intHour,Minute,Second;};构造函数和析构函数29第29页,共63页,2023年,2月20日,星期四构造函数(例)//实现构造函数watch::watch(intinitH,intinitM,intinitS){Hour=initH;Minute=initM;Second=initS;}构造函数和析构函数30第30页,共63页,2023年,2月20日,星期四构造函数(例)//主函数voidmain(void){watchmyWatch(05,06,07); //定义对象

watchwatch01(03,04,05);myWatch.SetTime();//按默认值设置

myWatch.ShowTime();cout<<endl;myWatch.SetTime(8,30,30);myWatch.ShowTime();cout<<endl;watch01.ShowTime();cout<<endl;}构造函数和析构函数31第31页,共63页,2023年,2月20日,星期四构造函数构造函数的名字一定和类的名字相同。构造函数没有返回值;函数也没有类型。构造函数主要是两个功能:为对象开辟空间,为对象中的数据成员赋初值。如果没有定义构造函数,编译系统会自动生成一个确省的构造函数。构造函数和析构函数32第32页,共63页,2023年,2月20日,星期四构造函数对上例中构造函数的默认构造函数是:

watch::watch(){}只能用来设置对象的存储空间,不能赋初值。构造函数和析构函数33第33页,共63页,2023年,2月20日,星期四构造函数含有确省参数的构造函数:classwatch{public:

watch(intinitH=0,intinitM=0,intinitS=0);//含有缺省参数构造函数

voidSetTime(intNewH,intNewM,intNewS); voidShowTime();private:intHour,Minute,Second;};构造函数和析构函数34第34页,共63页,2023年,2月20日,星期四构造函数含有确省参数的构造函数:voidmain(void){watchmyWatch; //按缺省值定义对象

watchwatch01(8,7);//只传递一个参数

watchwatch01(03,04,05);}注:缺省值不能在构造函数实现时规定。构造函数和析构函数35第35页,共63页,2023年,2月20日,星期四拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。class类名{public:类名(形参);//构造函数类名(类名&对象名);//拷贝构造函数...};类名::类名(类名&对象名)//拷贝构造函数的实现{函数体}构造函数和析构函数36第36页,共63页,2023年,2月20日,星期四拷贝构造函数classLocation{public:Location(intxx=0,intyy=0){X=xx;Y=yy;}

Location(Location&p);intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};构造函数和析构函数37第37页,共63页,2023年,2月20日,星期四Location::Location(Location&p){X=2*p.X;Y=2*p.Y;cout<<"拷贝构造函数被调用"<<endl;}第38页,共63页,2023年,2月20日,星期四拷贝构造函数当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现拷贝赋值。例:intmain(void){LocationC;//按默认值定义

LocationA(1,2);LocationB(A);//拷贝构造函数被调用

cout<<B.GetX()<<““<<B.GetY()<<endl;return0;}构造函数和析构函数39第39页,共63页,2023年,2月20日,星期四拷贝构造函数执行结果:

拷贝构造函数被调用 24构造函数和析构函数40第40页,共63页,2023年,2月20日,星期四拷贝构造函数若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如:voidf(Locationp){cout<<p.GetX()<<endl;}intmain(){LocationA(3,4);f(A);//调用拷贝构造函数

return0;}

构造函数和析构函数41第41页,共63页,2023年,2月20日,星期四拷贝构造函数执行时,调用拷贝构造函数,将对象A拷贝到形参p,然后再执行函数f。执行结果: 拷贝构造函数被调用

6

构造函数和析构函数42第42页,共63页,2023年,2月20日,星期四拷贝构造函数当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:Locationg(){LocationA(1,2);returnA;//调用拷贝构造函数}intmain(){LocationB;B=g();return0;}构造函数和析构函数43第43页,共63页,2023年,2月20日,星期四拷贝构造函数如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷贝构造函数。这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。构造函数和析构函数44第44页,共63页,2023年,2月20日,星期四析构函数完成对象被删除前的一些清理工作。在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。如果程序中未定义析构函数,编译器将自动产生一个缺省的析构函数。构造函数和析构函数45第45页,共63页,2023年,2月20日,星期四构造函数和析构函数举例#include<iostream.h>classLocation{public:Location(intxx,intyy);~Location();//...其它函数原形

private:intX,intY;};构造函数和析构函数46第46页,共63页,2023年,2月20日,星期四Location::Location(intxx,intyy){X=xx;Y=yy;}Location::~Location(){}//...其它函数的实现略第47页,共63页,2023年,2月20日,星期四构造初始化表构造函数也可使用构造初始化表对数据成员进行初始化:如:Circle::Circle(floatr){radius=r;}可改写为:Circle::Circle(floatr):radius(r){}构造函数和析构函数48第48页,共63页,2023年,2月20日,星期四构造初始化表又如:classA{inti;floatf;public:A(intX,floatY){i=X;f=Y;};};构造函数和析构函数相当于:classA{inti;floatf;public:A(intX,floatY):i(X),f(Y){};};49第49页,共63页,2023年,2月20日,星期四聚集的概念类中的成员数据是另一个类的对象。可以在已有的抽象的基础上实现更复杂的抽象。类的聚集50第50页,共63页,2023年,2月20日,星期四举例classPoint{private:intx,y;//点的坐标

public:Point(intxx=0,intyy=0){x=xx;y=yy;}//构造函数

Point(Point&p);intGetX(){returnx;}//取X坐标

intGetY(){returny;}//取Y坐标};类的聚集51第51页,共63页,2023年,2月20日,星期四//拷贝构造函数的实现Point::Point(Point&p){x=p.x;y=p.y;cout<<p.x;cout<<"Point拷贝构造函数被调用"<<endl;}第52页,共63页,2023年,2月20日,星期四//类的聚集,Distance类的定义classDistance{public:Distance(Pointxp1,Pointxp2);doubleGetDis(){returndist;}private:Pointp1,p2;doubledist;};//Distance类以两个类的对象p1,p2为成员数据。//构造函数以两个类的对象xp1、xp2作为形式参数第53页,共63页,2023年,2月20日,星期四//类的聚集的构造函数Distance::Distance(Pointxp1,Pointxp2):p1(xp1),p2(xp2){cout<<"Distance的构造函数被调用"<<endl;doublex=double(p1.GetX()-p2.GetX());doubley=double(p1.GetY()-p2.GetY());dist=sqrt(x*x+y*y);}//x和y是函数的局部变量,和Point类的成员无关。//sqrt是求平方根函数,要使用math.h头文件第54页,共63页,2023年,2月20日,星期四//主函数voidmain(){Pointmyp1(1,1),myp2(4,5);Distancemyd(myp1,myp2);cout<<"Thedistanceis:";cout<<myd.GetDis()<<endl;}//在生成myd对象时,生成两个对象myp2和myp1//再将它们作为实在参数传递给构造函数Distance第55页,共63页,2023年,2月20日,星期四//运行结果4Point拷贝构造函数被调用1Point拷贝构造函数被调用1Point拷贝构造函数被调用4Point拷贝构造函数被调用Distance的构造函数被调用Thedistanceis:5//第56页,共63页,2023年,2月20日,星期四classLine{private:pointp1,p2;//线段的两个端点public:Line(Pointa,Pointb);//构造函数VoidDraw(void);//画出线段};//...函数的实现略第57页,共63页,2023年,2月20日,星期四类聚集的构造函数设计原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。定义形式:类名::类名(对象成员所需的形参,本类成员形参)

:对象1(参数),对象2(参数),......{本类初始化}类的聚集58第58页,共63页,2023年,2月20日,星期四类聚集的构造函数调用构造函数调用顺序:先调用内嵌子对象的构造函数(按内嵌时的定义顺序,先定义者先构造)。然后调用本类的构造函数。(析构函

温馨提示

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

评论

0/150

提交评论