1、单击以编辑,母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+,面向对象的程序设计,主讲教师,张晓欢,本课程的任务,本课程是为,已经学过,C,语言程序设计,、,具有程序设计初步知识的学生开设的,,主要介绍面向对象程序设计的基本知识和方法。,本课程学习的主要任务,:,使学生了解面向对象的基本概念和方法。,初步掌握,C+,程序设计的基本技能。,为以后进一步学习和应用打下良好的基础。,本课程的主要内容,第,1,章,从,现实生活,和,面向对象程序设计,的两个角度,简单介绍面向对象程序设计的一些概念,例如,对象,与,类,、,抽象,与,封装,、,继承性,、,多态性,等。,第,2
2、章,介绍,C+,对,C,在非面向对象方面的改进与增强,为以后各章的学习打下基础。,第,3,章到第,10,章,介绍,C+,面向对象程序设计的基本知识和方法。,第,11,章,介绍面向对象程序设计方法与实例。,课程性质,:专业基础课(必修课),学 时,:讲课,28,学时 上机,26,学时,先修课程,:,C,语言程序设计,成绩比例,:,平时,40,考试,60,(,考勤、作业、上机,),教 材,C+,面向对象程序设计,陈维兴 陈昕 编著,人民邮电出版社,参 考 书,C+,程序设计教程,钱能,清华大学出版社,C+,程序设计(第二版)实验指导,钱能,清华大学出版社,C+,程序设计(第二版)习题解答,钱能,
3、清华大学出版社,C+,语言程序设计(第,4,版),郑莉,清华大学出版社,学习,C+,的几点看法,1.,了解,C+,研制,C+,的初衷为了解决大型软件开发中遇到的问题,提高软件的开发效率。只有参加过大型软件开发的人才会真正体会到,C+,的优越性。,曾经有同学说:,也许,你是一个玩游戏的高手,但是你的,C+,水平不会和你通关的能力一起变高,“,可以时刻记住:学,C+,是为了编游戏的”,。,2.,正确定位,同学们没有从事程序设计的实际经验,,现在学习,C+,的目的是了解面向对象程序设计方法,能够利用,C+,编写相对简单的程序,,为以后进一步学习和应用打好良好的基础。,企图,通过几十小时的学习,使一个
4、没有程序设计基础的人变成一个熟练的,C+,开发人员,是不可能的。,3.,勤学多练,由于,C+,涉及概念很多,语法比较复杂,内容十分广泛,对,C,语言的基础要求很高,不少人感到学习难度较大,难以入门。,学好,C+,的秘诀是:,认真听讲,多读程序;,编程,编程,再编程;,上机,上机,再上机。,第,1,章 面向对象方法概述,1.1,什么是面向,过程,程序设计方法,1.2,什么是面向,对象,程序设计方法,1.3,面向对象程序设计的语言,本章主要内容,C+,是,20,世纪,80,年代初开发成功的。,90,年代以来,,面向对象的程序设计,(,Object_Oriented Programming,简称,O
5、OP,),异军突起,迅速地在全世界流行,并一跃而成为程序设计的,主流技术,。,近年来推出的新一代,程序设计语言,、,软件开发工具,与,开发环境,,以及,操作糸统,等,几乎都是面向对象的。,面向对象的,程序设计,面向对象的,数据库,面向对象的,操作系统,面向对象的,系统分析,面向对象的,系统设计,例如:,C+,、,VB,、,VC,、,PB,、,VF,、,Java,、,Windows,等,为什么面向对象的程序设计(,OOP),会发展的如此迅速,成为当前的主流技术?,1.1,什么是面向过程程序设计方法,1.1.1,面向过程程序设计方法概述,1.1.2,面向过程程序设计方法的局限性,本节主要内容,1.
6、1.1,面向过程程序设计方法概述,面向过程程序设计方法是流行很广泛的程序设计方法。如,C,、,PASCAL,、,FORTRAN,等语言都是采用面向过程程序设计方法。,在面向过程程序设计中,程序设计者不仅要考虑程序要,“做什么”,还要解决,“怎么做”,的问题。,首先要明确程序的功能,程序设计的重点是如何,设计算法和实现算法,。,在面向过程程序设计中,普遍采用,结构化程序设计,方法,即所有的程序由,顺序、分支和循环,三种基本结构组成。,面向过程程序设计的,求解过程,:,(1),进行,整体规划,将一个复杂的任务按功能分解成一个个易于控制和处理的子任务,;,(2),对每个子任务,按功能再进行细化,依此
7、进行,直到不需要细分为止。具体实现程序时,每个子任务对应一个子模块,模块间尽量相对独立,;,(3),通过模块间的调用关系或全局变量而,有机地联系起来。,在,C,语言中,可以将每一个子模块对应设计成一个函数,各个函数及函数间的调用关系组成了程序。,例,1.1,利用面向过程程序设计方法计算圆和三角形的面积。设圆的半径为,r,,圆周率取,3,14,,则圆面积的计算公式为,cs,=3.14*r*r;,设三角形的高为,h,,底为,w,,则三角形面积的计算公式为,ts,=0.5*h*w,。,用面向过程程序设计方法编写一个计算面积的,C,语言程序。,#include,double,circle(double
8、r)return 3.14*r*r;/,定义函数,circle,double,triangle(double,h,double,w)/,定义函数,triangle,return 0.5*h*w;,void main()/,定义主函数,main,double,r,h,w,cs,ts,;,printf(“Input,r,h,w,:,”,);/,调用函数,输出字符串,scanf(%lf%lf%lf,&r,&h,&w,);,/,调用函数,scanf,输入圆的半径和三角形高和底的值,cs,=,circle(r,);/,调用函数,circle,ts,=,triangle(h,w,);/,调用函数,tri
9、angle,printf(The,area of circle,is:%fn,cs,);/,调用函数,输出圆的面积,printf(The,area of triangle is,:,%,fn,ts,);,/,调用函数,输出三角形的面积,这个,C,语言程序表示了面向过程程序设计的主要特征:,程序由过程定义和过程调用组成,(,所谓过程,简单地说,就是程序执行某项操作的一段代码,函数是最常用的过程,。,),可以用以下的公式来表述,:,程序,=,过程,+,调用,1.1.2,面向过程程序设计方法的局限性,1.,传统程序设计开发软件的生产效率低下,硬件:,电子管,晶体管,集成电路,大规模集成电路,生产能力
10、不断提高、更新越来越快、功能越来越强、价格越来越低。,软件,:,机器语言,汇编语言,高级语言,生产能力低下、开发周期长、效率低、更新较慢、费用不断上升。,为什么出现这个问题?,主要原因是计算机硬件生产较好地解决了以下三个问题,:,重用性,复杂性,可维护性,而传统的程序设计不能很好地解决这三个问题。,(1),重用性,传统软件生产中缺乏大粒度、可重用的构件。基本处于手工作业阶段。,(2),复杂性,传统程序中,数据,与其,操作,是相,分离,的,开发大程序时,常因数据的一个的小小变动而导致意想不到的错误,甚至整个程序的崩溃。以致出现过所谓的,“,软件危机,”,。,(3),可维护性,传统程序中数据与操作
11、相分离的结构不利于程序的维护,。,2.,传统程序设计难以应付日益庞大的信息量和多样的信息类型,随着计算机科学与技术的飞速发展,应用领域,:,已从数值计算扩展到了人类社会的各个方面,;,处理的数据,:,已从简单数字和字符,发展为具有多种格式的多媒体数据,如文本、图形、图像、影像、声音等,;,描述的问题,:,从单纯的计算问题到仿真复杂的自然现象和社会现象。,然而,面对这些庞大的信息量和多样的信息格式,传统程序设计方法是无法应付的,。,3.,传统的程序设计难以适应各种新环境,当前,并行处理、分布式、网络和多机系统等,已经或将是程序运行的主流方式和主流环境。,传统的程序设计技术很难适应这些新环境。,综
12、上所述,传统的面向过程的结构化程序设计不能够满足计算机技术的迅猛发展的需要,软件开发迫切需要一种新的程序设计方法的支持。,1.2,什么是面向对象程序设计方法,1.2.1,面向对象程序设计方法的基本概念,1.2.2,面向对象程序设计方法的基本特征,1.2.3,面向对象程序设计方法的主要优点,本节主要内容,1.2.1,面向对象程序设计方法的基本概念,1.,对 象,2.,类,3.,消 息,4.,方 法,本节主要内容,所谓对象就是可以控制和操作的实体。在现实世界中,任何事物都是对象。,它可以是人,也可以是物,还可以是一件事,整个世界就是由形形色色的“对象”构成的,。,对象可以是,:,*,有形的具体存在
13、的事物,例如,:,一辆车、一个球、一个小学生,;,*,无形的、抽象的事件,例如,:,一次演出、一场球赛等。,对象既可以很简单,也可以很复杂,复杂的对象可以由若干简单的对象构成。,1.,对象,现实世界中的对象既具有静态的属性,(,或称状态,),又具有动态的行为,(,或称功能,),。,举例:,对象名,:,录音机,对象的属性,:,生产厂家,:SONY,机器编号,:XXXX,出厂日期,:2009.05.06,对象的行为,:,播放,录音,停止,倒带,静态特征,动态特征,现实世界中的对象,具有以下特性,:,(1),有一个名字:,每一个对象必须有一个名字,称为对象名,以区别于其他对象,;,(2),有一组属性
14、用属性来描述它的某些特征,一般可以用数据来表示,所有的属性都有值,;,(3),有一组行为,:,对象的行为或功能也称为方法,一般用一组操作来描述,;,(4),有一组接口:,除施加于对象内部的操作外,对象还提供了一组公有操作用做与外界的接口,从而可以与其他对象建立关系。,使用对象时只需知道它向外界提供的,接口,形式而不需要知道它的内部是如何实现的。,这样,不仅使得对象的使用变得非常简单、方便,而且具有很高的安全性和可靠性。,可见面向对象程序设计中的对象来源于现实世界,更接近人们的思维。,在,面向对象程序设计,中,:,对象是,描述其属性的,数据,以及,对这些数据施加的,一组,操作,封装在一起构成
15、的统一体。,在,面向对象程序设计,中,:,对象是,描述其属性的,数据,以及,对这些数据施加的,一组,操作,封装在一起构成的统一体。,对象可以认为是,:,数据,+,操作,。,在,面向对象程序设计,中,:,对象是,描述其属性的,数据,以及,对这些数据施加的,一组,操作,封装在一起构成的统一体。,对象可以认为是,:,数据,+,操作,。,对象,数 据,操作代码,在,面向对象程序设计,中,:,对象是,描述其属性的,数据,以及,对这些数据施加的,一组,操作,封装在一起构成的统一体。,对象可以认为是,:,数据,+,操作,。,用,数据,来体现上面提到的“属性”,用,函数,来实现对数据的操作,以实现某些功能。,
16、例如一个圆对象,:,半径,-,数据,(,属性,),计算并输出圆的面积,-,操作代码(,用函数实现,),对象,数 据,操作代码,在,现实世界,中,,“类”是对一组具有共同的属性和行为的对象的抽象。,例如,教师黎明是一个对象。,对象名,:,黎明,对象的属性,:,年龄,:45,学历,:,博士,职称,:,教授,对象的行为(操作),:,走路,吃饭,授课,一个个的象黎明这样的教师就构成,教师类。,2.,类,类,和,对象,之间的关系是,抽象,和,具体,的关系,,类,是对多个对象进行,抽象的结果,。,一个,对象,是类的一个,实例。,例如:,张三、李四、王五、,.,人,对象,类,再如:,苹果、梨、桔子、香蕉,-
17、水果,对象 类,在,面向对象程序设计,中,,“类”就是具有相同的数据(属性)和相同的操作代码(函数)的一组对象的集合。,在,C+,语言中把类中的数据称为,数据成员,类中的操作是用函数来实现的,这些函数称为,成员函数,。,实际上,,类,是一种新的用户定义的,抽象的,数据类型,对象是类的一个实例。,在,面向对象程序设计,中,,“类”就是具有相同的,数据,和,操作,(,函数,),的,一组对象的集合,。,在,C+,语言中把类中的数据称为,数据成员,类中的操作是用函数来实现的,这些函数称为,成员函数,。,实际上,,类,是一种新的用户定义的,抽象的,数据类型,对象是类的一个实例。,例如,:,数据类型,实
18、 例,int,a,b(,变量,),学生类,张三,李四,(,对象,),水果类,苹果,桔子(对象),类类型,与,传统数据类型,的,重要区别,是,:,一个类在定义,数据,的同时也定义了对这些数据的,操作,。,在,面向对象程序设计,中,:,总是先声明类,再由类生成其对象。,类是建立对象的“,模板,”,按照这个模板所建立的一个个具体的对象,就是类的实际例子,通常称为,实例,。,在面向对象程序设计中,对象之间的联系,称为,对象的交互,。,在面向对象程序设计中,一个,对象,向另一个,对象,发出的请求被称为“,消息,”,。,3.,消息,消息具有三个性质,:,(1),一个对象可以同时向多个对象发送消息,也可以接
19、收多个对象发来的消息,;,(2),相同形式的消息可以传递给不同的对象,同一个对象也可以接收不同形式的消息,;,(3),接收对象对消息的响应并不是必须的,对象可以响应消息,也可以不响应。,调用对象中的函数就是向该对象传送一个,消息,要求该对象实现某一行为,(,功能,),。,对象所能实现的行为,(,功能,),在程序设计方法中称为,方法,它们是通过调用相应的,函数,来实现的。,实际上:,在,C+,语言中,方法,是通过,成员函数,来实现的,。,消息和方法的关系是,:,对象根据接收到的消息,调用相应的方法,;,反过来,有了方法,对象才能响应相应的消息。,4.,方法,面向对象程序设计是一种新的程序设计范型
20、这种范型的主要特征是,:,程序,=,对象,+,消息,程序员注重的是,:,类的设计和编写,,即问题域中涉及几个类,各个类之间的关系如何,每个类包含哪些数据和函数(操作代码),再由类生成其对象。,程序中的,一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法(通过成员函数)完成相应的操作。,/,例,1.2-1,利用面向对象思想求解计算圆面积的基本框架。,class Circle /,声明圆类,Circle,定义数据成员,r(,表示圆的半径,),定义数据成员,cs,(,表示圆的面积,),定义成员函数,radius_input,(,用于输入圆半径,r,的值,),定义成员函数,c_a
21、rea_out,(,用于计算与输出圆面积,),;/,圆类,Circle,到此结束,int,main()/,定义主函数,main,定义圆类,Circle,的对象,c1,向对象,c1,传送一个消息,即调用成员函数,radius_input,输入圆半径,r,的值,向对象,c1,传送一个消息,即调用成员函数,c_area_out,计算与输出圆面积,/,主函数,main,到此结束,#include,/,例,1.2-1,利用面向对象思想求解计算圆的面积。,class Circle /,声明圆类,Circle,double r;/,定义数据成员,r(,表示圆的半径,),double,cs,;/,定义数据成员
22、cs,(,表示圆的面积,),public:,void,radius_input,()/,定义成员函数,radius_input,printf(Input r,:,);scanf(%lf,void,c_area_out,()/,定义成员函数,c_area_out,cs,=3.14*r*r;,printf(The,area of circle,is:%fn,cs,);,;/,圆类,Circle,到此结束,int,main()/,定义主函数,main,Circle c1;/,定义圆类,Circle,的对象,c1,c1.radius_input();/,向对象,c1,传送一个消息,,/,即调用函数,
23、radius_input,输入圆半径,r,的值,c1.c_area_out();/,向对象,c1,传送一个消息,即调用,/,函数,c_area_out,计算与输出圆面积,return 0,;/,主函数,main,到此结束,程序的一次运行结果如下:,Input r,:,10,The area of circle is:314.000000,1.2.2,面向对象程序设计的基本特征,1.,抽 象,2.,封 装,3.,继 承,4.,多 态,本节主要内容,1.,抽 象,现实生活中:,张三、李四、王五、,.-,人,苹果、梨、桔子、香蕉,.-,水果,抽象的过程是将有关事物的共性归纳、集中的过程,。,在程序设
24、计方法中:,抽象是对复杂世界的简单表示,抽象并不打算了解全部问题,而,只强调感兴趣的信息,忽略了与主题无关的信息,。,例如,在设计一个,成绩管理程序,的过程中,只关心他的姓名、学号、成绩等,而对他的身高、体重等信息就可以忽略。,而在设计学生,健康信息管理系统,中,身高、体重等信息必须抽象出来,而成绩则可以忽略,。,C,和,C+,中的基本数据类型就是对一批具体的数的抽象。,例如,:,“,整型数据”是对所有整数的抽象。,2.,封装,在,现实世界,中,所谓封装就是把某个事物包围起来,外界是看不到的,甚至是不可知的。,例如:录音机、电视机、照相机等。,在,面向对象程序设计,中,封装,是指把,数据,和实
25、现,操作的代码,集中起来放在,对象内部,并尽可能隐蔽对象的内部细节。,对象好像是一个不透明的,黑盒子,表示对象属性的,数据,和实现各个,操作的代码,都被,封装在黑盒子,里,从外面是看不见的,各个对象之间是相对独立的,互不干扰。,对象只留下少量接口,以便与外界联系。,C+,对象中的,成员函数名,就是对象的,对外接口,,外界可以通过,成员函数名,来调用函数来实现某些操作。,封装具有两方面的含义,:,一是将有关的数据和操作代码封装在一个对象中,各个,对象相对独立、相不干扰,。,二是将对象中某些数据与操作代码对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外界隐蔽的做
26、法称为,信息隐蔽,。,封装和抽象机制可以,将对象的使用者与设计者分开,,使用者不必知道对象行为实现的细节,只需要使用设计者提供的接口让对象去做。,这样,大大降低了人们操作的,复杂程度,,还有利于,数据安全,。从而减轻了开发一个软件糸统的难度。,3.,继承,(1),继承的概念,父亲,儿子,继承关系可以使后者继承前者的基本特性,又可以增加一些新的特性。,哺乳动物,(热血、有毛发、用奶哺育幼仔),狗,(有犬牙、食肉、特定的骨骼结构、群居),白狗 黑狗,(白色)(黑色),继承关系简化了人们对事物的认识和叙述,简化了工作程序。,若类之间具有继承关系,则它们之间具有下列几个特性:,1,类间具有共享特性(包
27、括数据和程序代码的共享);,2,类间具有差别或新增部分(包括非共享的数据和程序代码);,3,类间具有层次结构。,假设有两个类,-,类,A,和,类,B,,,若,类,B,继承,类,A,,,则,类,B,具有,类,A,的基本特性(包括,数据,和,操作,),A,B,这时,,我们称,类,A,为,基类,或,父类,;,而称,类,B,为,类,A,的,派生类,或,子类,。,我们可以说,:,类,B,继承,了类,A,还可以说,:,类,B,是从类,A,中,派生,出来的。,如果,类,B,是,类,A,的派生类,那么,在构造类,B,的时候,不必描述,派生类,B,的所有特性,,只需,:,1.,让它继承,类,A,的特性,,2.,
28、增加,类,B,与,基类,A,不同的那些特性。,可见,,类,B,的特性是由,继承来的,和,新添加的,两部分特性构成。,类的,派生过程可以无限继承下去,,即,派生类,可以作为,另一个派生类,的基类。,祖父,父亲,儿子,继承机制的作用:,一是避免公用代码的重复开发,减少代码和数据冗余。,二是通过增强一致性来减少模块间的接口和界面。,(2),继承的分类,从,继承源,上划分,:,继承分为,单继承,和,多继承,。,单继承,-,一个派生类只继承了一个基类的特性。,多继承,-,一个派生类继承了多个基类的特性。,4.,多态,面向对象系统的,多态性,是指不同的对象收到,相同的的消息,时,执行,不同的操作,。,4.
29、多态,面向对象系统的,多态性,是指不同的对象收到,相同的的消息,时,执行,不同的操作,。,1.,在日常生活中:,汽车 行为,1,挪开,同一消息,凳子 行为,2,4.,多态,面向对象系统的,多态性,是指不同的对象收到,相同的的消息,时,执行,不同的操作,。,1.,在日常生活中:,汽车 行为,1,挪开,同一消息,凳子 行为,2,2.,在,OOP,中:,窗口对象 行为,3,移动,同一消息,棋子对象 行为,4,C+,语言支持两种多态性,:,编译时的多态性 运行时的多态性,编译时的多态性,是通过,函数重载,和,运算符重载,来实现的,;,运行时的多态性,是通过,虚函数,来实现的,。,将分别在第,2,章、
30、第,6,章与第,7,章进行介绍。,1.2.3,面向对象程序设计的主要优点,1.,可提高程序的重用性,2.,可控制程序的复杂性,3.,可改善程序的可维护性,4.,能够更好地支持大型程序设计,5.,增强了计算机处理信息的范围,6.,能很好地适应新的硬件环境,1.3,面向对象的程序设计语言,1.3.1,面向对象程序设计语言的发展概况,1.3.2.,几种典型的面向对象程序设计语言,本节主要内容,1.3.1,面向对象程序设计语言的发展概况,现在公认的第一个真正面向对象程序设计语言是,Smalltalk,。,它是由美国的,Xerox,公司于,20,世纪,70,年代初,研制的。,该语言第一次使用了“面向对象
31、的概念和程序风格,开创了面向对象程序设计的新范型。,被誉为面向对象程序设计语言发展的里程碑。,20,世纪,80,年代以来,面向对象语言得到飞速发展,。,面向对象程序设计语言朝着,两个方向发展,:,一个方向是朝着纯面向对象语言发展,如继,Smalltalk,之后,又出现了,Eiffel,、,SELF,等语言,;,另一个方向是朝着混合型面向对象语言发展,如将,过程型与面向对象结合,产生了诸如,C+,、,Objective-C,、,Object Pascal,等一大批语言。将,函数型与面向对象结合,产生了诸如,LOOPS,、,Flavors,、,CLOS,等语言。,我们将要学习的,C+,就是一种,面向过程,与,面向对象,相结合的语言。,1.3.2,几种典型的面向对象程序设计语言,(,1)Smalltalk,语言,(20,世纪,70,年代,),Smalltalk,语言被认为是最纯正最具代表性的面向对象的程序设计语言,(2)C+,语言,(20,世纪,80,年代,),C+,是在,C,语言的基础上,进行面向对象特征的扩充而成的语言,(3)Java,语言(,20,世纪,90,年代),Java,语言,是一种面向对象的程序设计语言,是一种网络编程语言。,(4)C#,语言,(21,世纪,2000,年,),C#,语言从,C/C+,语言继承发展而来,是一个全新的、面向对象的、现代的编程语言。,






