C++面向对象程序设计 第一章面向对象编程整理
1.1 面向过程的编程风格与面向对象的编程风格
C语言是面向过程语言,也称为命令型语言,面向过程通常采用自顶向下设计,问题复杂时不断运用自顶向下设计(即函数分解法)直到容易处理。自顶向下设计优点是直观有条理,缺点是难于进行软件维护,包括软件系统的测试、调试和升级等,牵一发而动全身。
模块化的组织方式:将整个系统分解为若干模块,模块之间通过接口传递信息,模块划分应尽可能高内聚,低耦合。
内聚:模块内各元素彼此结合的紧密程度;耦合:不同模块间的依赖紧密程度。
问题:高耦合引起程序崩溃;低内聚使数据无法管理,程序难以理解;数据安全性问题;可维护性及可重用性差;图形界面难以实现和维护;串联改变。
程序设计=数据结构+算法
程序内容=过程+过程调用
面向对象=对象+类+继承+消息
面向对象程序设计是面向过程编程的一种替代技术,其中构成模块的基本单元是类而不是过程。面向对象设计中的类是对象(object)的集合体,对象是数据结构和算法的封装体,属于类的任何对象共享该类的所有属性。
程序=对象+消息
面向对象程序设计的优点:实现对现实世界客体的自然描述;可控制复杂性;可增强模块性;可提高重用性;可改善可维护性。
面向对象与面向过程的差异:采用对象为中心的解题方法更自然、更直接地反映真实世界的问题空间;以对象为中心的方法具有继承性;以对象为中心的解题方法采用消息传递机制作为对象之间相互通信的唯一方式,而机构化方法采用显式调用方法进行通信。
一个类(如Human类)就是一个数据类型,可以定义变量(如Mary),表示Mary属于Human。Human类型的变量可以拥有成员变量(member variable)或域(field)。这些成员变量称为数据成员(如feetCount)。属于类的函数称为函数成员,这种函数在面向对象语言中叫做方法。作为数据类型,类必须将变量(C++的数据成员)和过程(C++的函数成员)结合起来,这样才可以使用这些数据类型对各种实体建模。(即:类是成员变量和过程的聚合体,通过该聚合体,类得以完成将对象进行建模的任务)。
关系是指在类与类之间、对象及其所属类之间存在的各种关系。关系有多种类型,如类与类之间的拥有has a、继承is a、实例化 belongs to数据关系;对象和类之间也存在着实例化或隶属于的关系。
1.2 类与抽象数据类型
对象是面向对象开发模式的基本成分,可用一组属性和可执行的一组操作来定义,属性一般只能通过执行对象的操作来改变,操作又称为方法、行为或服务,它描述了对象执行的功能,若通过消息传递,还可以为其他对象使用。
类是一组具有相同数据结构和操作的对象的集合,定义包括一组数据属性和在数据上的一组合法操作,可以产生对象,对象是类的实例,可使用类中的函数。
定义类时最少包含:类名;外部接口;内部实现。
面向对象语言中的类是支持信息隐藏的模块,C++使用关键字public和private来对类的属性和操作进行存取访问控制。
面向过程编程过程作为模块的基本单元,并且数据处理在过程中进行。面向对象编程的基本单元是类,通过类这种机制可以将数据和处理这些数据的过程封装为一个有机的整体——类。
当一个数据类型仅暴露其公有接口,而将其私有实现隐藏起来,我们称这个数据类型是抽象的。C++通过对类的支持提供了信息隐藏,而信息隐藏特别是对低层实现细节的隐藏,是构造抽象数据类型的关键,而且在抽象数据类型中提供某个功能的办法就是将该功能以类的成员函数的形式封装起来。使用抽象数据类型将提高程序的可靠性和健壮性。
1.3 客户/服务器模式与消息传递
面向对象编程以客户/服务器模式为计算基础,该模式诠释了面向对象编程中的重点:信息隐藏。信息隐藏也可以提高服务器的健壮性。
消息由三部分组成:接收消息的对象;消息标识符(即消息名,实质上是方法名);零个或多个变元。如MyCircle.Show(Green),MyCircle是接收消息的对象的名字,Show是消息名,Green是消息的变元。
对象交互的两种形式:直接交互,直接调用另一对象的公共操作,在没有消息管理机制的单人舞操作系统环境下用的最多;间接交互,一对象发送消息到消息队列中,由操作系统识别消息有那个对象接受,然后调用相应对象的相关操作。
在面向对象程序中,类和对象表现为服务器,使用类和对象的模块(如函数)表现为客户,客户通过特殊的方式请求服务。由于设计良好的类仅输出客户所需的服务,因而类接口通常只包含高层的方法,类的数据成员通常为类的高层接口提供服务,客户端代码工作高于高层,消息传递机制也强调了类和对象作为一种服务器其接口实际上就是他所称的服务集。
1.4 继承与多态
继承支持代码重用,从而提高软件的可靠性。所有面向对象语言至少支持单重继承:任何一个子类都只有一个父类。有些语言如C++还支持多重继承,一个子类可以有多个父类。无论是单重继承还是多重继承,子类都从其所有的父类继承所有的数据成员和成员函数。
使用多重继承会增加命名冲突的可能性:派生类和基类发生命名冲突或者基类和基类发生命名冲突。解决命名冲突问题的方法是使用域解析符。
在面向对象语言中,多个不同函数可以具有相同的函数签名,即多态方法。
多态方法在继承层次结构中属于类。在多态上下文中,如果子类提供了自己的多态方法定义,称为子类覆盖(override)父类具有相同签名档的方法。
多态机制可以消除显式的递归调用从而避免了面向过程方法表现出来的复杂逻辑。
1.5 接口与组件
在某些面向对象语言(如Java)中接口为关键字。而C++支持抽象基类,通过公有的、高层的方法来指定类的接口。在类之间共享接口带来极大便利,接口共享这种多态机制极其适用于组件技术。
软件组件是预先创建好的程序模块,可与其他模块一起构成一个程序。组件栖身于容器中。容器是一种软件机制,用来对组件进行整合,并为组件间通信提供服务,容器和组件的有机结合体构成程序。从使用者角度来看,一个组件是一些前端接口的后盾服务者,程序员通过组件接口所暴露的函数来操作该组件。
组件对象模型COM
COM是一种不依赖于任何语言的组件对象模型,是关于如何建立可动态互访组件以及如何通过组件建立应用程序的一个规范,通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作系统是否相同、使用的开发语言是否一致等。总之,是一种跨应用和语言共享二进制代码的方法。
COM的优点:应用程序可定制;提高软件的可重用性;分布式、远程调用等应用程序开发得以简化。
分布式组件对象模型DCOM是COM组建的扩展,在COM的应用程序、组件、工具等基础上处理网络协议的低层次的细节问题,使用户不必关心网络协议细节。
1.6 面向对象开发
开发指的是软件的生命周期,系统开发主要是建模。
三种模型:
类模型:描述系统内部对象及其关系的静态结构。
状态模型:描述了对象随时间而变化的部分。
交互模型:描述系统中的对象如何协作以完成更为宽泛的任务。