面向对象程序设计.doc

上传人:星星 文档编号:1077036 上传时间:2024-04-12 格式:DOC 页数:25 大小:187.50KB
下载 相关 举报
面向对象程序设计.doc_第1页
第1页 / 共25页
面向对象程序设计.doc_第2页
第2页 / 共25页
面向对象程序设计.doc_第3页
第3页 / 共25页
面向对象程序设计.doc_第4页
第4页 / 共25页
面向对象程序设计.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、 面向对象程序设计n 结构化程序设计的基本内容:1. 结构的类型:顺序、分支、循环2. 结构化程序设计思想:利用过程或函数来抽象和模拟客观现实。3. 结构化程序设计方法:1) 重点放在如何实现细节过程方面,将数据与函数分开。2) 形式:主模块+若干个子模块(如:main()+子函数)。4. 特点:自顶向下,逐步求精功能分解。5. 缺点:效率低,是手工作坊式的编程。6. 结构化程序的问题数据与算法分离,程序数据和操作数据的函数是分离的。n 面向对象程序设计观点:1. 自然界是由各种各样的实体(对象)所组成,每种对象都有自己的内部状态和运动规律,不同对象之间的相互联系和相互作用就构成了各种不同的系

2、统,进而构成整个客观世界。2. 程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。3. 要求:高度概括、分类和抽象。4. 目的:实现软件设计的产业化。5. 基本概念:1) 对象:用来描述客观事物的一个实体,它是构成系统的一个基本单元。一个对象具有一组属性和行为。实体对象*一台计算机抽象对象*一项计划2) 对象构成要素:对象标识符:是对象的名称,用来区别于其他对象。属性:是用来描述对象静态特征的一个数据项。行为:是用来描述对象动态特征和行为的操作。3) 消息(Message)用于描述事件发生的信息。消息是对象之间发出的行为请求。多个消息构成一个事件(Event)。对象之间通过传递消息相互

3、影响。对象示例:一个“学生”对象的例子对象名:学生属性:学号:123456姓名:令狐冲年龄:18专业:信管行为:修改学号、姓名、专业、年龄等等对象示例:一个“课程”对象的例子:对象名:课程属性:课程号:123456课程名:程序设计任课教师:莫名选课要求:学时:48行为:获取并修改课程名、课程号、学时数、选课要求、任课教师等4) 类:是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供统一的抽象描述,是对象集合的再抽象。5) 类和对象的关系:类(抽象定义)对象(实例)6) 类对象举例学生学生王强课程C+程序设计类型变量,如C语言中的int和int x;7) 类的实例用类定义的类变量,

4、即对象。类是对多个特性相同的对象实例的抽象,所以同一类的不同实例之间必有:l 相同的操作集合l 相同的属性集合l 不同的对象名,分配有不同的存储空间。8) 类的确定与划分:类的确定对所遇到的对象进行分析、归纳,根据共同的特征来确定一个类。类的确定的方法:l 判断是否有一个以上的实例l 判断类的实例中是否有绝对的不同点9) 类的划分不是绝对的,可以根据不同的实际需要确定不同的类。n 面向对象程序设计的特点:1. 抽象性:抽象(abstract)是指有意忽略问题的某些细节和与当前目标无关的方面,以便把问题的本质表达得更清楚。2. 封装性:1) 封装encapsulation将数据和与这个数据有关的

5、操作集合在一起,形成一个实体对象,且尽可能隐藏对象的内部细节。2) 特点:l 具有一个清楚的边界,对象的所有私有数据、内部程序(成员函数)细节都被固定在这个边界内。l 具有一个接口,描述了对象之间的相互作用、请求和响应消息。l 对象内部的实现代码受到封装壳的保护,其它对象不能直接修改本对象所拥有的数据和代码。l 封装的单位是对象。3) 封装性:l 从外面看只能看到对象的外部特性,即能够受理哪些信息,具有哪些处理能力;对象的内部,即处理能力的实行和内部状态,对外是不可见的。l 从外面不能直接使用对象的处理能力,也不能直接修改其内部状态,对象的内部状态只能由其自身改变。4) 封装的优点:l 降低部

6、件间的耦合度,提高部件的独立性l 具有隐藏性和安全性(如银行的账户)l 易于维护(由于数据独立,易于发现问题)l 封装将对象的使用者与设计者分开,使用者只需要通过接口访问对象,不必了解对象的内部细节,提高了软件复用。5) 封装的缺点:l 需要更多的输入输出函数。6) 抽象与封装形成了程序接口与实现的分离。3. 继承性:继承性是指特殊类的对象拥有其一般类的属性和行为的特性。1) 继承:继承是一种联结类与类的层次模型。对象类之间的相交关系,使得某类对象可以继承另外一类对象的特征和功能。2) 类间具有继承关系的特性:l 类间具有共享特征(包括数据和程序代码的共享):遗传l 类间具有细微差别或新增部分

7、(包括非共享的程序代码和数据):变异l 类间具有层次结构(如同人类通过继承构成了家族关系一样)3) 继承分类:l 从继承源上划分:单继承(一个派生类只有一个基类)、多继承(一个派生类有多个基类)l 从继承内容上划分:取代继承、包含继承、受限继承、特化继承。4) 继承的作用:l 实现软件的可重用性l 实现软件的独立性l 增加软件的可维护性2) 继承与封装的关系:l 封装是指对象的封装,在对象中数据和操作总是包裹在一起的,继承不会影响对象的这种封装性,但无限制的派生继承会在一定程度上损害对象中数据的隐蔽性。l 封装使类定义中实现的代码可以用于该类的各个实例(对象)中,实现了动态共享代码;继承使得派

8、生类能与基类共享基类中实现的代码,实现了静态共享代码。3) 类的层次:由一个类可以派生出任意多个派生类,这样就形成了类的层次关系,这是现实世界中事物的分类问题在计算机中的解形式。4) 继承的优势:l 能清晰体现相关类间的层次结构关系。l 有效地址提高了程序的可重用性,减小了程序代码的冗余度。l 增强了程序的一致性,减少了程序模块间的接口和界面,使程序更易维护。l 继承是自动传播程序代码的有力工具。l 继承是新类构造、建立和扩充的有效手段。l 继承具有传递性。如果类C继承类B,类B继承类A,则类C继承类A。l “站在巨人的肩头上”。用户在开发新系统时不必从零开始,可以继承原有相似功能或者从类库中

9、选取需要的类,再派生新类。5) 例:人类按职业划分的一种继承关系4. 多态性:1) 多态polymorphism:多态是指类中同一函数名对应多个具有相似功能的不同函数。对象根据所接受的消息而做出动作,同样的消息为不同的对象接受时可导致完全不同的行动,该现象称为多态性。简单地说:单接口,多实现。举例:sqrt_i (int i),sqrt_f (float f)sqrt (int i),sqrt (float f)2) 多态性:指可以使用相同的调用方式来调用这些具有不同功能的同名函数的特性。3) 作用:l 减轻程序员负担l 降低程序员出错机率4) 多态性的实现:l 运行时多态性:虚函数l 编译时

10、多态性:重载l 重载函数重载:是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字。运算符重载:是指同一个运算符可以施加于不同类型的操作数上面。优点:重载进一步提高了面向对象系统的灵活性和可读性。5) 例:下图中同名函数person( )作用在Student、Teacher等不同类上时,将执行不同的操作,这就是多态。n 面向对象与面向过程程序设计比较:1. 面向过程程序设计的基本特点:1) 按层次组织模块。2) 每一模块只有一个入口,一个出口。3) 代码和数据分离,即程序=数据结构+算法。 4) 方法:自顶向下,逐步求精,模块化2. 面向对象程序设计:1) 它将数据和操作数据的过

11、程(函数)绑在一起,形成一个相互依存、不可分离的整体(即对象),从同类对象中抽象出共性,形成类。2) 同类对象中的数据原则上只能用本类提供的方法(成员函数)进行处理。类通过封装将接口与实现分离开来,通过接口与外界联系。对象之间通过消息进行通信。3. 两种程序方法的对比:面向对象程序设计将数据和操作数据的程序代码绑在一起构成对象,具有更好的可维护性,因某类对象数据的改变只会引起该类对象操作代码的改变,而与其他类型的对象无关,这就把程序代码的修改维护局限在一个很小的范围内。4. 面向对象程序设计的优点:1) 符合人们习惯的思维方法,便于分解大型的复杂多变的问题。由于对象对应于现实世界中的实体,因而

12、可以很自然地按照现实世界中处理实体的方法来处理对象,软件开发者可以很方便地与问题提出者进行沟通和交流。2) 易于软件的维护和功能的增减。对象的封装性及对象之间的松散组合,都给软件的修改和维护带来了方便。采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。3) 可重用性好。重复使用一个类(类是对象的定义,对象是类的实例化),可以比较方便地构造出软件系统,加上继承的方式,极大地提高了软件开发的效率。4) 与可视化技术相结合,改善了工作界面。随着基于图形界面操作系统的流行,面向对象的程序设计方法也将深入人心。它与可视化技术

13、相结合,使人机界面进入GUI时代。5) 质量高。在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。6) 扩展方便。由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。n 三种常用面向对象程序设计语言简介:1. 混合型面向对象程序设计语言C+2. 纯面向对象程序设计语言Java3. 可视化程序设计语言Visual Basic /四人中有一人中了奖,小李问这四人时,回答如下:/A:不是我/B:是C/C:是D/D:C胡说/已知其中三人说的是真话,一人说假话,试根据这些信息找出中奖者#include vo

14、id main()int k=0,count=0,sum=0;char thisman;for(k=0;k=3;k+)thisman=A+k;sum=(thisman!=A)+(thisman=C)+(thisman=D)+(thisman!=D);if(sum=3)printf(中奖者为:%cn,thisman);count+;if(count=0)printf(无解!n);elseprintf(共有:%d种符合条件的情况!n,count);/四人中有一人中了奖,小李问这四人时,回答如下:/A:不是我/B:是C/C:是D/D:C胡说/已知其中三人说的是真话,一人说假话,试根据这些信息找出中奖

15、者#include class Findpublic:void answer()int k=0,count=0,sum=0;char thisman;for(k=0;k=3;k+)thisman=A+k;sum=(thisman!=A)+(thisman=C)+(thisman=D)+(thisman!=D);if(sum=3)printf(中奖者为:%cn,thisman);count+;if(count=0)printf(无解!n);elseprintf(共有:%d种符合条件的情况!n,count);void main()Find it;it.answer();/四人中有一人中了奖,小李问

16、这四人时,回答如下:/A:不是我/B:是C/C:是D/D:C胡说/已知其中三人说的是真话,一人说假话,试根据这些信息找出中奖者#include class Findpublic:void answer()int k=0,count=0,sum=0;char thisman;for(k=0;k=3;k+)thisman=A+k;sum=(thisman!=A)+(thisman=C)+(thisman=D)+(thisman!=D);if(sum=3)printf(中奖者为:%cn,thisman);count+;if(count=0)printf(无解!n);elseprintf(共有:%d种

17、符合条件的情况!n,count);Find()printf(-欢迎使用-n);void main()Find it;it.answer();6.0教学资料1. /C+程序的基本结构#include #define PI 3.1415926 void main() double r,area; coutr; area=PI*r*r; cout圆面积为:areaendl;2. /结构体示例#include struct stu_score char name12; char NO9; float score3; stuone=李明,21020501,80,85,85; void main() do

18、uble aver; aver=(stuone.score0+stuone.score1+stuone.score2)/3; cout平均成绩为:aver、=、=、!=6. 自增(+)自减(-)运算符7. 逻辑运算符:与(&)、或(|)、非(!)u 按位与(&)u 按位或(|)u 按位异或()u 取反()u 左移()8. 符合位运算符赋值:&=、|=、=、=、=9. sizeof运算符10. 逗号运算符11. 内存管理运算符:u new:double *p;p=new double;int *p;p=new int(40);/开辟60个int型内存单元u delete:delete p;12.

19、 /带默认参数值的函数#include void display(int a,int b=2,int c=3) couta=a,b=b,c=cendl;void main() display(1); display(1,5); display(1,5,7);13. /函数重载#include int sum(int a,int b) return a+b;int sum(int a,int b,int c) return a+b+c;double sum(double a,double b) return a+b;double sum(double a,double b,double c) r

20、eturn a+b+c;void main() coutsum(1,2)endl; coutsum(1,2,3)endl; coutsum(1.0,2.0)endl; coutsum(1.0,2.0,3.0)endl;14. /函数参数的指针传递#include void swap(int *x,int *y) int temp; temp=*x; *x=*y; *y=temp;void main() int a(10),b(100); cout交换前:a,bendl; swap(&a,&b); cout交换后:a,bendl;15. /函数参数的引用传递(引用实质是已定义变量的别名)#inc

21、lude void swap(int &x,int &y) int temp; temp=x; x=y; y=temp;void main() int a(10),b(100); cout交换前:a,bendl; swap(a,b); cout交换后:a,bendl;16. 变量作用域1) 程序级:包含组成该程序的所有文件。属于程序级作用域的有外部函数和外部变量2) 文件级:仅在定义它的文件内有效。属于文件级作用域的有内部函数和外部静态变量3) 函数级:仅在定义它的函数体内有效。属于函数级作用域的有函数的形参和函数内定义的自动类变量4) 块级:属于块级的有定义在分程序、if语句、switch语

22、句及循环语句中的自动变量、寄存器类变量和内部静态变量其中作用域属于前两类的变量习惯上称为全局变量,属于后两类的称为局部变量。另外有以下说明:1) 内部函数的定义用关键字static实现,外部函数的定义用关键字extern实现,静态变量(包括内部的及外部的)用关键字static实现,函数的默认类型为外部函数2) 外部变量、外部静态变量、内部静态变量定义时有默认值:int型的为0;浮点型的为0.0;char型的为空17. /用类计算平均分#include #include class CStuScorepublic: char name7; char no9; CStuScore(float s0

23、,float s1,float s2) fScore0=s0; fScore1=s1; fScore2=s2; void SetScore(float s0,float s1,float s2) fScore0=s0; fScore1=s1; fScore2=s2; CStuScore() cout-n; float GetAverage(); void ShowScore() coutname的平均成绩为:GetAverage()endl; private: float fScore3;float CStuScore:GetAverage() return (float)(fScore0+f

24、Score1+fScore2)/3);void main() CStuScore one(60,70,74); strcpy(one.name,李明); strcpy(one.no,21010101); one.ShowScore(); one.SetScore(60,88,64); one.ShowScore();18. /对象成员的初始化#include class CPointpublic: CPoint(int x,int y) nPosX=x; nPosY=y; void ShowPos() cout当前位置:x=nPosX,y=nPosYendl; private: int nPo

25、sX,nPosY;class CSizepublic: CSize(int l,int w) nLength=l; nWidth=w; void ShowSize() cout当前大小:l=nLength,w=nWidthendl; private: int nLength,nWidth;class CRectpublic: CRect(int left,int top,int right,int bottom); void Show() ptCenter.ShowPos(); size.ShowSize(); private: CPoint ptCenter; CSize size;CRec

26、t:CRect(int left,int top,int right,int bottom):size(right-left,bottom-top),ptCenter(right+left)/2,(bottom+top)/2)void main() CRect rc(10,100,80,250); rc.Show();19. /通过友元实现对类中私有成员及保护成员的访问#include class CPointpublic: CPoint() m_x=m_y=0; CPoint(unsigned x,unsigned y) m_x=x; m_y=y; void print() coutX=m_

27、x,Y=m_yendl; friend CPoint Inflate(CPoint &pt,int nOffset);/声明友元函数private: unsigned m_x,m_y;CPoint Inflate(CPoint &pt,int nOffset)/定义友元函数 CPoint ptTemp=pt; ptTemp.m_x+=nOffset; ptTemp.m_y+=nOffset; return ptTemp;void main() CPoint pt(10,20); pt.print(); pt=Inflate(pt,3);/调用友元函数 pt.print();20. /继承#in

28、clude #define PI 3.1415926class graphpublic: graph() circumference=0; area=0; void show() cout周长为:circumference,面积为:areaendl; double circumference,area;class circle:public graphpublic: circle(double x=0) r=x; void setr(double x) r=x; void calculate() circumference=2*PI*r; area=PI*r*r; private: doubl

29、e r;class rectangle:public graphpublic: rectangle(double x=0,double y=0) a=x; b=y; void setab(double x,double y) a=x; b=y; void calculate() circumference=2*(a+b); area=a*b; private: double a,b; void main() graph g; circle c(10); rectangle rec(2,5); g.show(); c.show(); c.setr(100); c.calculate(); c.s

30、how(); rec.show(); rec.calculate(); rec.show(); rec.setab(20,50); rec.calculate(); rec.show();21. /虚函数,实现“运行时多态性”的方式#include #define PI 3.1415926class CShapepublic: virtual float area()/定义虚函数 return 0; ;class CTriangle:public CShapepublic: CTriangle(float h,float w) H=h; W=w; float area() return(flo

31、at)(H*W*0.5); private: float H,W;class CCircle:public CShapepublic: CCircle(float r) R=r; float area() return(float)(PI*R*R); private: float R;void main() CShape *s2; s0=new CTriangle(3,4); coutarea()endl; s1=new CCircle(5); coutarea()endl;/说明:/、虚函数在重新定义时参数的个数、类型必须和基类中的虚函数安全匹配/、虚函数的上述功能,只有通过基类指针才能实现

32、22. /纯虚函数:无法预先确定基类中虚函数的具体实现时采用纯虚函数#include #define PI 3.1415926class CShapepublic: virtual float area()=0;/定义纯虚函数,此时没有具体的代码实现;class CTriangle:public CShapepublic: CTriangle(float h,float w) H=h; W=w; float area()/纯虚函数在派生类中的具体实现代码 return(float)(H*W*0.5); private: float H,W;class CCircle:public CShape

33、public: CCircle(float r) R=r; float area()/纯虚函数在派生类中的具体实现代码 return(float)(PI*R*R); private: float R;void main() CShape *s2; s0=new CTriangle(3,4); coutarea()endl; s1=new CCircle(5); coutarea()endl;23. /运算符重载:是实现“编译时多态性”的一种手段#include class CComplexpublic: CComplex(double r=0,double i=0) realPart=r; i

34、magePart=i; void print() cout该复数为:=0) cout+imagePartiendl; else cout-imagePartiendl; CComplex operator+(CComplex &c);/重载运算符+ CComplex operator+(double r); /重载运算符+private: double realPart; double imagePart;CComplex CComplex:operator+(CComplex &c)/参数是CComplex的引用对象 CComplex temp; temp.realPart=realPart

35、+c.realPart; temp.imagePart=imagePart+c.imagePart; return temp;CComplex CComplex:operator+(double r)/参数是double类型变量 CComplex temp; temp.realPart=realPart+r; temp.imagePart=imagePart; return temp;void main() CComplex c1(12,20),c2(50,70),c; c=c1+c2; c.print(); c=c1+20; c.print();24. /赋值运算符重载:错误使用开会运算符的情况/相同类型或匹配类型可以直接赋值,但当对的的成员中有数组或动态数据类型时就不能直接赋值,如下:#include #include class CDemopublic: CDemo(char *s) ps=new charstrlen(s)+1; strcpy(ps,s); CDemo() if(ps) deleteps; void print() coutpsendl;

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 学术论文 > 毕业论文

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922