面向对象程序设计55299_第1页
面向对象程序设计55299_第2页
面向对象程序设计55299_第3页
面向对象程序设计55299_第4页
面向对象程序设计55299_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、C+语言语言 与与 面向对象程序设计面向对象程序设计 贵州大学计算机科学系贵州大学计算机科学系 C+语言与面向对象的设计语言与面向对象的设计 第第1章章 面向对象程序设计概论面向对象程序设计概论 1. 1 程序设计技术的发展程序设计技术的发展 1.1.1 面向机器的语言面向机器的语言 机器语言机器语言是硬件逻辑设计所实现的机器指令的集合,是硬件逻辑设计所实现的机器指令的集合, 也就是由硬件所能实现的语义序列集合。其表现形式为能被机也就是由硬件所能实现的语义序列集合。其表现形式为能被机 器直接接收的二进制代码序列。器直接接收的二进制代码序列。 汇编语言汇编语言是机器语言的直接符号映射。它用人类能

2、够是机器语言的直接符号映射。它用人类能够 理解的助记符号来表示机器指令、寄存器、存储器地址等物理理解的助记符号来表示机器指令、寄存器、存储器地址等物理 概念,以提高程序的可读性。概念,以提高程序的可读性。 早期的计算机应用以问题求解为主要目标,早期的计算机应用以问题求解为主要目标, 算法的设计和实现是程序设计活动的焦点。注重追算法的设计和实现是程序设计活动的焦点。注重追 求算法的效率,并不特别注意算法与数据结构的依求算法的效率,并不特别注意算法与数据结构的依 赖关系,算法和数据处于相对独立的状态。赖关系,算法和数据处于相对独立的状态。 1.1.2 面向问题的语言面向问题的语言 FORTRAN语

3、言语言 引入了程序设计语言中程序控制程序控制 结构、符号命名机制结构、符号命名机制等一些最重要的基本概念。例如:命命 名子程序、变量作为存储单元的抽象以及数组的概念等。名子程序、变量作为存储单元的抽象以及数组的概念等。 随着编译技术的突破产生的随着编译技术的突破产生的高级语言高级语言用接近人用接近人 类习惯的自然语言或数学语言表达问题、编制程序。类习惯的自然语言或数学语言表达问题、编制程序。 高级语言通过引入一些抽象概念,屏蔽机器底层高级语言通过引入一些抽象概念,屏蔽机器底层 的差异,使它独立于机器,不但有效地提高了程序设计的差异,使它独立于机器,不但有效地提高了程序设计 的效率,也带来了程序

4、的可移植性。的效率,也带来了程序的可移植性。 由于算法总是以过程(子程序)的形式由于算法总是以过程(子程序)的形式 出现,面向问题的程序也叫做过程化程序出现,面向问题的程序也叫做过程化程序 设计。设计。 模块化程序设计模块化程序设计 FORTRAN语言还引入了语言还引入了独立编译的模块独立编译的模块和和 可重用子程序库可重用子程序库的概念,这种技术后来被称为的概念,这种技术后来被称为模模 块化程序设计。块化程序设计。 模块化的思想是将应用程序划分若干个模块化的思想是将应用程序划分若干个 规模适度的模块,每个模块独立命名、独立规模适度的模块,每个模块独立命名、独立 编译,最后通过连接程序形成可招

5、待的应用编译,最后通过连接程序形成可招待的应用 程序。程序。 模块化程序设计带来了以下一些重要概念:模块化程序设计带来了以下一些重要概念: 模块内信息隐藏,模块内信息隐藏,一个模块中的变量可以与一个模块中的变量可以与 其它模块中的变量同名而不至于产生混淆;其它模块中的变量同名而不至于产生混淆; 模块间通过全局环境共享数据;模块间通过全局环境共享数据; 模块间通过外部变量、公共变量实模块间通过外部变量、公共变量实 现通信。现通信。 模块化程序设计倡导的这些概念被证明是程序组织和模块化程序设计倡导的这些概念被证明是程序组织和 管理有效的基本手段,在以后程序设计技术发展的各个阶段管理有效的基本手段,

6、在以后程序设计技术发展的各个阶段 得以延续和发展得以延续和发展。 1.1.3 面向数据结构的程序设计面向数据结构的程序设计 研究证明,仅用研究证明,仅用顺序,分支,循环三种顺序,分支,循环三种 基本控制结构基本控制结构即能构造出任何单入口、单出即能构造出任何单入口、单出 口的程序块。口的程序块。 这些研究结果与模块化的概念相结合,这些研究结果与模块化的概念相结合, 形成了采用形成了采用自顶向下、逐步求精自顶向下、逐步求精的设计步骤的设计步骤 和和单入口单出口单入口单出口基本控制结构的基本控制结构的结构化程序结构化程序 设计设计方法。方法。 Pascal语言和语言和C语言都是结构化程序语言都是结

7、构化程序 设计语言。同时它们也是过程化程序设计设计语言。同时它们也是过程化程序设计 语言。语言。 Pascal语言用过程来组织程序。语言用过程来组织程序。 C语言用函数来组织程序。语言用函数来组织程序。 过程过程(Procedure)和函数和函数(Function)是子程序是子程序 (Subroutine)的两种具体形式。的两种具体形式。过程没有返回值。过程没有返回值。 函数函数有且只有一个返回值。函数函数有且只有一个返回值。 结构化程序设计的研究中有一个重要的结论,结构化程序设计的研究中有一个重要的结论, 表示为公式:表示为公式:程序程序=算法算法+数据结构数据结构,强调算法对数,强调算法对

8、数 据结构的依赖性,体现了一种数据结构为中心的观据结构的依赖性,体现了一种数据结构为中心的观 念。念。 大多数结构化语言都具有大多数结构化语言都具有定义新的数据类型定义新的数据类型的的 功能,如功能,如C语言中枚举语言中枚举(enum) 、结构、结构(struct)类型等类型等 。这有利于比较准确地描述待求解问题中的实体,。这有利于比较准确地描述待求解问题中的实体, 并保证数据的一致性。并保证数据的一致性。 数据库技术和数据库管理语言也体现了程序设数据库技术和数据库管理语言也体现了程序设 计以数据结构为中心的鲜明特色。计以数据结构为中心的鲜明特色。 以数据结构为中心的蔽端:以数据结构为中心的蔽

9、端: 整个程序中许多重要的过程和函数的实现依整个程序中许多重要的过程和函数的实现依 赖于一个或几个关键数据结构,如果关键数据结构赖于一个或几个关键数据结构,如果关键数据结构 中的一个或几个数据有所改变,则会波及到整个系中的一个或几个数据有所改变,则会波及到整个系 统,许多过程和函数必须重写。这是不利于程序的统,许多过程和函数必须重写。这是不利于程序的 维护和扩展的。维护和扩展的。 1.1.4 面向对象的程序设计面向对象的程序设计 面向对象的程序设计方法继承了结构化、过程化、模块化等 方法的所有积极成分,创造性地引入了“对象”这一构建程序 的基本构件。 对象对象是由是由数据结构数据结构和对和对

10、数据结构的数据结构的操作或运算操作或运算封装封装 而成的一个整体。而成的一个整体。 封装使得算法和数据结构的关系由算法对数由算法对数 据结构单方面的依赖变成了相互依存据结构单方面的依赖变成了相互依存的关系。 在面向对象的软件系统中,一个个不同类型的对象相互作 用,自底向上构建起整个程序系统。 它以 “对象对象= 数据结构数据结构+算法,算法, 程序程序=对象对象+对象对象+对象对象” 取代了“程序程序=数据结构数据结构+算法算法”的传统程序设计 模式。因而引起了一场程序设计观念的革命。 面向对象方法采用数据抽象与隐面向对象方法采用数据抽象与隐 藏、层次结构体系,动态绑定等概念藏、层次结构体系,

11、动态绑定等概念 和措施,提供一种和措施,提供一种模拟人类认知方式模拟人类认知方式 的软件系统建模方法的软件系统建模方法,带来了系统的,带来了系统的 安全性、可扩充性、代码重用、易维安全性、可扩充性、代码重用、易维 护等人们期待的特性。护等人们期待的特性。 OOPL的来源与发展的来源与发展 OOPL(Object Oriented Programming Language 面向对象程序设计语言)面向对象程序设计语言) 20世纪世纪60年代年代, 由挪威计算中心由挪威计算中心Ole Dahl和和Krysten Nygaard.主持开发的主持开发的Simula 67 被公认为是面向对象语言被公认为是

12、面向对象语言 的先驱。的先驱。 20世纪世纪70年代,由美国国防部资助开发的年代,由美国国防部资助开发的Ada语言语言 ,以它对抽象数据类型的支持,而在面向对象语言发展中占,以它对抽象数据类型的支持,而在面向对象语言发展中占 有重要地位。有重要地位。 Simula 67 和和Ada被看作是被看作是OOPL的两个直的两个直 接的接的“祖先祖先”,一个引入,一个引入“模拟模拟”,一个引入,一个引入 “抽象抽象”。 20世纪世纪70年代到年代到80年代年代, 美国美国Xerox公司,公司,Palo Alto 研究中心(研究中心(PARC)的)的Alan Kay, Adale Goldberg和和Da

13、n Ingans等人主持开发的等人主持开发的Smalltalk语言正式使用了语言正式使用了“面向对象面向对象 ”这个术语。它的问世标志着面向对象程序设计方法的正式这个术语。它的问世标志着面向对象程序设计方法的正式 形成。形成。 1981年推出的年推出的Smalltalk-80是是Smalltalk语言最完善的语言最完善的 版本。它是第一个能够实际应用的纯的面向对象语言。在版本。它是第一个能够实际应用的纯的面向对象语言。在 Smalltalk_80中类和对象不仅仅是语言成分,而且是交互式中类和对象不仅仅是语言成分,而且是交互式 程序设计环境的组成部分。程序设计环境的组成部分。 80年代中期,年代

14、中期,Simular 67、Smalltalk_80等语言的影响仅仅局限等语言的影响仅仅局限 在学术界。面向对象语言对计算平台的特殊要求使这些语言难于被软件在学术界。面向对象语言对计算平台的特殊要求使这些语言难于被软件 开发商和程序员接受。开发商和程序员接受。 贝尔实验室的贝尔实验室的Bjarne Stroustrup 及其研究小组在当及其研究小组在当 时最受欢迎的时最受欢迎的C语言基础上开发的语言基础上开发的C+语言,引入了对面语言,引入了对面 向对象概念的支持。向对象概念的支持。 C+语言以其与语言以其与C语言兼容、高运行效率等优良特性,语言兼容、高运行效率等优良特性, 使面向对象程序设计

15、技术受到软件工业界的广泛关注,使之使面向对象程序设计技术受到软件工业界的广泛关注,使之 进入一个全面发展的时期。尽管进入一个全面发展的时期。尽管C+只能算作一种混合式面只能算作一种混合式面 向对象语言向对象语言。但是正是由于大量。但是正是由于大量C程序员通过程序员通过C+的帮助才的帮助才 迅速掌握了面向对象的概念和方法,全面促进了面向对象技迅速掌握了面向对象的概念和方法,全面促进了面向对象技 术的应用,从而使术的应用,从而使C+成为最有影响的面向对象语言成为最有影响的面向对象语言,甚至,甚至 许多人把许多人把C+当作当作面向对象的代名词面向对象的代名词。 面向对象技术的流行进一步促进了面向对象

16、语言的繁荣。面向对象技术的流行进一步促进了面向对象语言的繁荣。90年年 代涌现出了一大批实用的面向对象语言,如代涌现出了一大批实用的面向对象语言,如Object Pascal 、Eiffel、Java等等。等等。 Java语言是由语言是由Sun Microsystem公司推出的一种公司推出的一种纯面向对象纯面向对象 语言语言。Java从从C+语言中继承了大量的语言成分,抛弃了语言中继承了大量的语言成分,抛弃了C+语言中冗语言中冗 余的和容易引起问题的功能,它将面向对象、平台无关性、稳定性、安余的和容易引起问题的功能,它将面向对象、平台无关性、稳定性、安 全性等集于一身,提供了一个良好的程序设计

17、环境,因而成为适合于分全性等集于一身,提供了一个良好的程序设计环境,因而成为适合于分 布式计算的程序设计语言。布式计算的程序设计语言。 Java语言于语言于90年代中期的迅速流行与它定位于当时迅速发展的年代中期的迅速流行与它定位于当时迅速发展的 Internet的的WWW应用开发有关。展示了面向对象技术与分布式计算结应用开发有关。展示了面向对象技术与分布式计算结 合的重大前景。合的重大前景。 后面向对象时代的计算机语言后面向对象时代的计算机语言 程序设计语言程序设计语言: C+, Java 脚本语言脚本语言: Java Script , VBScript 标记语言标记语言: SGML, HTM

18、L, XML 样式语言样式语言: CSS, XSL 建模语言建模语言: UML 1. 2 面向对象的基本概念面向对象的基本概念 1.2.1 面向对象的目标面向对象的目标 建立一个既能在计算机系统中自然建立一个既能在计算机系统中自然 地表示客观世界的问题、又能够超越程地表示客观世界的问题、又能够超越程 序复杂性障碍的程序设计模型。序复杂性障碍的程序设计模型。 面向对象方法通过对客观世界和问题世界的直接模拟,面向对象方法通过对客观世界和问题世界的直接模拟, 建立较为准确、自然的程序设计模型,从而获得信息处建立较为准确、自然的程序设计模型,从而获得信息处 理的更高性能。理的更高性能。 计算机世界 (

19、程序空间) 主观世界 (问题空间) 客观世界 (真实空间) 图 1.1 客观世界、主观世界和计算机世界 从计算机软件设计的角度, 引入类和对象的概念,将客观世 界和主观世界中的实体和问题直 接映射到计算机世界的程序空间。 这就是面向对象方法的基本出发 点。 分类:从大量相似的实体中归纳、抽象出相 同特征,为辨识新的个体形成参照模式。 对象和类的概念是面向对象技术中最重要 的概念。对象和类分别对应认识论中实体和 对实体的分类。 实体:客观世界或问题世界中可直接或间接 观察的个体。 物理实体:一本书,一辆汽车 观念实体:一笔帐,2008北京奥运会 抽象是对具体事物简化描述的过程,它强调了系统的某些

20、主要特性面而忽略了其它特性。 一个分类至少应抽象出两个方面的特征,一是数 据特征,一是行为特征。 比如人类,有年龄、性别、身高、体重,健康状 态、所属工作单位等特征,这些特征可以用一些具体的 数值来描述,属于数据特征。数据特征又称属性或状 态,是区分不同个体的依据。 人类还有行为特征,如吃饭、走路、学习、成长 等。行为特征是同一个类的所有个体共有的。 1.2.2 面向对象语言中的类和对象面向对象语言中的类和对象 在面向对象语言中通常以下面描述的方式来定义类在面向对象语言中通常以下面描述的方式来定义类: 类定义:类定义: 类名类名1 私有数据:私有数据: 数据类型数据类型1: 属性数据属性数据1

21、; 数据类型数据类型2: 属性数据属性数据2; 数据类型数据类型3: 属性数据属性数据3; 公有方法:公有方法: 方法(行为)方法(行为)1; 方法(行为)方法(行为)2; ; 类类是一个形体形体定 义,它对一个数据特 性和方法特性的封装 体进行说明。类定义 中包含两类成员:数 据成员和方法成员。 类的定义为该类的对 象提供了创建的模式。 根据已定义的类,可以按下述方式创建对象:根据已定义的类,可以按下述方式创建对象: 类名类名1:对象名:对象名1,对象名,对象名2; 类名类名2:对象名:对象名3; 对象对象是类的实例实例。 对象是按照类提供的 模板进行的实体定义,它 将为对象在内存中分配实

22、际的存储空间。在程序中 对象间相互通信和作用, 共同完成程序功能。 类与对象的关系就是数 据类型和该类型变量的关系。 如: int x. y; float f1, f2; clock t1, t2; Complex c1, c2, c3; 数据类型数据类型是不同形式的信息在内存中分配方式的基是不同形式的信息在内存中分配方式的基 本约定,是构造程序的基础。本约定,是构造程序的基础。 每种程序设计语言中都定义了自己的基本数据类型集合每种程序设计语言中都定义了自己的基本数据类型集合 和利用基本数据类型定义的扩展数据类型。和利用基本数据类型定义的扩展数据类型。 常量、变量甚至函数都有自己的数据类型。常

23、量、变量甚至函数都有自己的数据类型。 C语言等结构化程序设计语言还为用户提供了自定义数语言等结构化程序设计语言还为用户提供了自定义数 据类型的手段。据类型的手段。 从抽象数据类型的观点看类和对象从抽象数据类型的观点看类和对象 一个数据类型的定义包括一个值集和一个作用于该值 集的操作集。 如C语言中的int型(整型), 其值集为A= n| nN, -32768n+32767 , 其操作集是加、减、乘、整除、取模等等。 面向对象语言中的类是一种新的用户自定义数据类型面向对象语言中的类是一种新的用户自定义数据类型 “类类”类型。类型。 类的所有数据成员形成类类型的值集,类的所有方法类的所有数据成员形

24、成类类型的值集,类的所有方法 成员形成类类型的操作集。成员形成类类型的操作集。 以这个观点来看,对象就是“类类型”的一个实例, 通常以变量的形式出现。 如果定义了一个类名为book的类,则创建book类的对 象b1, b2的语法形式: book b1, b2; 和声明基本数据类型变量的语法形式: int a, b; double x; 完全一样。可以像使用整型变量a、b,双精度型变量x一样使 用book型变量b1、b2。 类类型能像内部数据类型一样工作。区别在于程 序员定义的类是为了描述具体问题,模拟问题空间中的 对象。实际上,程序员通过增添自己所需要的新类对程 序设计语言本身进行了扩展。 对

25、象中所包含的方法实际上就是过程或 函数,方法一定属于某个特定类的对象,是实现对 象功能算法的代码块。 在编写方法实现代码时仍应遵循结构化的原则, 使用单入口单出口的几种基本控制结构。 关于“方法” 在结构化程序设计中,过程是由使用在结构化程序设计中,过程是由使用 者显式调用的独立实体,对于相同的输者显式调用的独立实体,对于相同的输 入参数,每次过程调用有相同的结果。入参数,每次过程调用有相同的结果。 而在面向对象程序计中,过程作为对而在面向对象程序计中,过程作为对 象的方法,不再是独立存在的实体,而象的方法,不再是独立存在的实体,而 是对象功能的体现。这使得对象可以理是对象功能的体现。这使得对

26、象可以理 解为一台自动机。对象的私有数据可以解为一台自动机。对象的私有数据可以 看作自动机的状态。对象的状态只能由看作自动机的状态。对象的状态只能由 对象的方法改变。对象的方法改变。 对象状态的改变是通过向对象发送 消息来实现的。所谓发送消息,就是 从对象外部调用对象的公有方法。 发送消息不同于一般的过程调用,发送消息不同于一般的过程调用, 发送消息只是触发自动机,同样的输发送消息只是触发自动机,同样的输 入参数时,可能因为自动机状态不同入参数时,可能因为自动机状态不同 而有不同的输出结果。而有不同的输出结果。 1. 3 类的基本特性类的基本特性 1.3.1 封装性封装性 (Encapsula

27、te) 类的三大基本特性: 封装性、继承性和多态性 类是数据成员和方法成员的封装体。封装不 仅仅是将数据和方法这两种不同的语言成分捆绑在 一起,它还具有数据隐藏的机制。 数据隐藏是通过限制数据的访问权限实现的数据隐藏是通过限制数据的访问权限实现的 。一个类中的数据通常被声明为私有的。不允许从。一个类中的数据通常被声明为私有的。不允许从 类的外部直接访问。类的外部直接访问。 封装和数据隐藏封装和数据隐藏不仅防止了数据从外部破坏 的可能性,更保证了对象对于其边界以外的外部世 界作为一个自足的、透明的实体存在。 引入对象的封装机制的目的是将 对象的使用者和设计者区分开来。 类的公有方法是对象向对象的

28、使 用者开放的接口(Interface)。 从对象与其外部世界的关系来看,对象 是一个在系统中负有一定责任的服务器。 外部世界的事件,如人机交互、其它对 象的状态改变等等,可以看作请求对象服 务的客户。 对象通过公有方法,向外部声明自己提 供哪些服务,每个方法的参数说明了怎样 使用这些服务。 1.3.2 继承继承性性 (Inheritance) 人类对于客观事物的认识过程是没有止境的。在分类 问题上也是这样,随着认识水平的提高,原有的类需要划 分成若干个子类,子类又可以划分子类的子类,。这种 划分最终形成一个树状层次体系结构。 面向对象程序设计中通过类的继承性, 能够很好地模拟这种分类方式。

29、面向对象中类的继承性描述两个类之间的一种特殊面向对象中类的继承性描述两个类之间的一种特殊 关系,即上面所说的关系,即上面所说的“父父- -子关系子关系”。面向对象语言中允许。面向对象语言中允许 利用一个已定义的类来定义一个新类,通过这种利用,形利用一个已定义的类来定义一个新类,通过这种利用,形 成两个类之间的成两个类之间的继承关系继承关系。这个已定义的类称为。这个已定义的类称为基类基类,新,新 定义的类则称为它的定义的类则称为它的子类子类。子类除了包含基类的所有成员。子类除了包含基类的所有成员 之外,又增加了自己特有的新成员。之外,又增加了自己特有的新成员。 特殊类 一般类 一般类 特殊类 (

30、b)类的特征集合(a)类的实例集合 图 1.2 一般类与特殊类的关系 在由一个类划分出子类的过程中,子类必须具有其 父类的所有特征,同时又具有父类中其它成员所没有的新特 征。从成员集合来看,父类包含了子类的所有成员。从各自信息量从成员集合来看,父类包含了子类的所有成员。从各自信息量 的多少来看,有的多少来看,有“子大于父子大于父”的特点,的特点,因为要描述一个子类,必 须添加有别于父类中其它成员的新的信息。类间的这种类间的这种“父子父子 关系关系”反映了类的一般性和特殊性,也称为反映了类的一般性和特殊性,也称为“一般一般- -特殊关系特殊关系”。 子类定义的伪代码形式如下:子类定义的伪代码形式如下: 新类声明:子类名新类声明:子类名1 1 继承自:继承自: 基类名基类名1 1 数据成员;数据成员; 方法成员;方法成员; 子类对象在内存中所占的存储空 间一定大于其父类。继承机制使得子 类对象创建时首先要拷贝父类对象的 所有成员,既包括数据成员也包括方 法成员,不管是公有的还是私有的。 在为拷贝而来的成员分配内存储

温馨提示

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

评论

0/150

提交评论