1、兰州理工大学计算机与通信学院 年福忠,第1章 面向对象程序设计概述,第2章 C+概述,第3章 类与对象,第4章 派生类与继承,第5章 多态性,第6章 模板,第7章 C+的I/O流类库,C+面向对象程序设计,程序的目的:用于数学计算 主要工作:设计求解问题的过程 缺点:对于庞大、复杂的程序难以开发和维护,面向过程程序设计的基本概念,设计思路 自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。 程序结构 按功能划分为若干个基本模块,形成一个树状结构。 各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。 其模块化实现的具体方法是使用子程序。,
2、面向过程程序设计的基本概念,优点 有效地将一个较复杂的程序设计任务分解成许多易于控制和处理的子任务,便于开发和维护。,面向过程程序设计的基本概念,程序数据结构算法,缺点:可重用性差、数据安全性差、难以开发图形界面的应用 把数据和处理数据的过程分离。 当数据结构改变时,所有相关的处理过程都要进行相应的修改。 图形用户界面的应用,很难用过程来描述和实现,开发和维护都很困难。,面向过程程序设计的基本概念,将数据及对数据的操作封装在一起,作为一个相互依存、不可分离的整体对象。 对同类型对象抽象出其共性,形成类。 类通过外部接口,与外界发生关系。 对象与对象之间通过消息进行通讯。,面向对象程序设计的基本
3、概念,优点 程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。,程序对象消息,面向对象程序设计的基本概念,不同于面向过程的程序设计中以具体的解题过程为研究和实现的主体,面向对象的程序设计是以需解决的问题中所涉及到的各种对象为主要矛盾。更确切地,面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现。,对象、类与实体,图1 对象、实体与类,对象、类与实体,类是面向对象技术中一个非常重要的概念。简单地说,类是同种对象的集合与抽象。为了处理问题的方便,在面向对象的程序设计中
4、定义了类的概念来表述同种对象的公共属性和特点。从这个意义上来说,类是一种抽象的数据类型,它是所有具有一定共性的对象的抽象,而属于类的某一个对象则被称为是类的一个实例,是类的一次实例化的结果。,类,“对象”是现实世界的实体或概念在计算机逻辑中的抽象表示。具体地,对象是具有唯一对象名和固定对外接口的一组属性和操作的集合。其中对象名是区别于其他对象的标志;对外接口是对象在约定好的运行框架和消息传递机制中与外界通信的通道;对象的静态属性表示了它所处的状态;而对象的操作则用来改变对象的状态以达到特定的功能。对象最主要的特点是以数据为中心,它是一个集成了数据和其上操作的独立、自恰的逻辑单位。,对象,状态和
5、行为是对象的主要属性。 对象的状态又称为对象的静态属性,主要指对象内部所包含的各种信息,也就是变量。每个对象个体都具有自己专有的内部变量,这些变量的值标明了对象所处的状态。当对象经过某种操作和行为而发生状态改变时,具体地就体现为它的属性变量的内容的改变。通过检查对象属性变量的内容,就可以了解这个对象当前所处于的状态。,对象的属性,图2 对象的属性和行为,从图2中可以看出,对象的方法一方面把对象的内部变量包裹、封装、保护起来,使得只有对象自己的方法才能操作这些内部变量;另一方面,对象的方法还是对象与外部环境和其他对象交互、通信的接口,对象的环境和其他对象可以通过这个接口来调用对象的方法,操纵对象
6、的行为和改变对象的状态。,对象的属性,方法:作用在对象上的行为,对象的交互是通过对象的方法完成的。 消息:一个对象向另一个对象发出的请求被成为消息。对象有两类消息:共有消息和私有消息。消息有三个性质: 同一个对象可以接收多个不同的消息; 相同形式的消息可以传递给不同的对象; 对象对消息的响应不是必须的。,对象的交互,抽象:是指通过特定的实例或例子抽取共同性质形成概念的过程。 封装:是把对象的属性和服务结合成一个独立的系统单位。包含两个含义: 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口
7、使之与外部发生联系。,抽象与封装,封装的原则在软件上的反映是:使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的“交叉感染“,使软件错误能够局部化,大大减少查错和排错的难度。,抽象与封装,balance interestYTD owner account_numberMakeDeposit WithDraw Transfer,MakeDeposit WithDraw Transfer,用户不能存取的数据,实现细节 (对用户不可见),用户,接口,特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如,轮船、客轮;人、大人。一个类可以是多个一般类的
8、特殊类,它从多个一般类中继承了属性与服务,这称为多继承。例如,客轮是轮船和客运工具的特殊类。通常我们称一般类为父类(superclass,超类),特殊类为子类(subclass)。,继承性,具有继承关系的类之间具有以下特性:类间具有共享特征类间具有差别或新增部分类间具有层次结构继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。,继承性,继承的分类1、单继承:子类只从一个父类继承;2、多继承:子类从一个以上父类继承。,继承性,对象的多态性是指在父类中定义的属性或服务被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或服务在父类及其各个子类中具
9、有不同的语义。例如:“几何图形“的“绘图“方法,“椭圆“和“多边形“都是“几何图“的子类,其“绘图“方法功能不同。,多态性,1、 编译时多态性编译时确定下来的多态性:重载 2、 运行时多态性动态运行时才可确定,主要通过继承结合动态绑定获得:重定义,多态的类型,问题:输入圆的半径,求圆的周长和面积,数据描述: 半径,周长,面积均用实型数表示 数据处理:输入半径 r;计算周长 = 2*r ;计算面积 = * r*r ;输出半径,周长,面积;,结构化程序与面向对象程序,方法一,用结构化方法编程,求圆的周长和面积,/ count the girth and area of circle #includ
10、e void main () double r, girth, area ; const double PI = 3.1415 ;cout r ; girth = 2 * PI * r ; area = PI * r * r ;cout “radius = “ r endl ; cout “girth = “ girth endl ;cout “area = “ area endl ; ,数据描述,数据处理,输入数据,输出计算结果,注释行,方法二,用面向对象方法编程,求圆的周长和面积,分析,“圆”是抽象的类类型,建立具体的圆(对象),半径?,圆的周长 ?面积 ?,实例化,方法二,用面向对象方法
11、编程,求圆的周长和面积,分析,圆类数据成员半径成员函数置半径值求圆的半径求周长求面积,实例化,#include class Circle double radius ;public :void Set_Radius( double r ) radius = r ; double Get_Radius() return radius ; double Get_Girth() return 2 * 3.14f * radius ; double Get_Area() return 3.14f * radius * radius ; ; void main() Circle A, B ;A.Set_
12、Radius( 6.23 ) ;cout “A.Radius = “ A.Get_Radius() endl ;cout “A.Girth = “ A.Get_Girth() endl ;cout “A.Area = “ A.Get_Area() endl ;B.Set_Radius( 10.5 ) ;cout “B.radius = “ B.Get_Radius() endl ;cout “B.Girth=“ B.Get_Girth() endl ;cout “B.Area = “ B.Get_Area() endl ; ,Circle 类定义,数据成员,成员函数,建立对象 (类变量),通过对象 调用类的成员函数,编辑程序,在VC集成开发环境 选择新建文件命令,程序的编译执行,编辑程序,在弹出对话框 选择文件类型,程序的编译执行,编辑程序,输入源程序文件名,程序的编译执行,编辑程序,在编辑窗口 输入源程序,程序的编译执行,编译程序,选择 编译命令,程序的编译执行,用热键 选择编译命令,编译程序,程序的编译执行,执行程序,选择 执行命令,程序的编译执行,热键 选择执行命令,程序的编译执行,执行程序,执行程序,等待输入数据,程序的编译执行,运行结果,程序的编译执行,执行程序,