C++面向对象程序设计习题解答与上机指导(第三版)
上QQ阅读APP看书,第一时间看更新

第一篇 《C++面向对象程序设计(第三版)》习题和参考答案

第1章 面向对象程序设计

【1.1】什么是面向对象程序设计?

【解】

面向对象程序设计是一种新型的程序设计范型。这种范型的主要特征是:

程序=对象+消息

面向对象程序的基本元素是对象,面向对象程序的主要结构特点:第一,程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律。第二,程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完成相应的操作。

面向对象程序设计方法模拟人类习惯的解题方法,代表了计算机程序设计新颖的思维方式。这种方法的提出是对软件开发方法的一场革命,是目前解决软件开发面临困难的最有希望、最有前途的方法之一。

【1.2】在面向对象程序设计中,什么是对象?什么是类?对象与类的关系是什么?

【解】

在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。对象可以认为是:数据+操作。对象所能完成的操作表示它的动态行为,通常也把操作称为方法。

在面向对象程序设计中,“类”就是具有相同的数据和相同的操作的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。

类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,一个对象是类的一个实例。

【1.3】现实世界中的对象有哪些特征?

【解】

现实世界中的对象,具有以下特性:

(1)每一个对象必须有一个名字以区别于其他对象。

(2)用属性来描述它的某些特征。

(3)有一组操作,每个操作决定对象的一种行为。

(4)对象的操作可以分为两类:一类是自身所承受的操作,一类是施加于其他对象的操作。

【1.4】什么是消息?消息具有什么性质?

【解】

在面向对象程序设计中,一个对象向另一个对象发出的请求称为“消息”。当对象接收到发向它的消息时,就调用有关的方法,执行相应的操作。消息是一个对象要求另一个对象执行某个操作的规格的说明,通过消息传递才能完成对象之间的相互请求或相互协作。

消息具有以下三个性质:

(1)同一个对象可以接收不同形式的多个消息,做出不同的响应。

(2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的。

(3)对消息的响应并不是必需的,对象可以响应消息,也可以不响应。

【1.5】什么是方法?在C++中它是通过什么来实现的?

【解】

在面向对象程序设计中的消息传递实际是对现实世界中的信息传递的直接模拟。调用对象中的函数就是向该对象传送一个消息,要求该对象实现某一行为(功能、操作)。对象所能实现的行为(操作),在面向对象程序设计中称为方法,它们是通过调用相应的函数来实现的,在C++中方法是通过成员函数来实现的。

【1.6】什么是抽象和封装?

【解】

抽象是人类认识问题的最基本的手段之一。抽象是将有关事物的共性归纳、集中的过程。抽象是通过特定的实例(对象)抽取共同性质后形成概念的过程。面向对象程序设计中的抽象包括两个方面:数据抽象和代码抽象(或称行为抽象)。前者描述某类对象的属性或状态,也就是此类对象区别于彼类对象的特征物理量;后者描述某类对象的共同行为特征或具有的共同功能。

在现实世界中,所谓封装就是把某个事物包围起来,使外界不知道该事物的具体内容。在面向对象程序设计中,封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐蔽对象的内部细节。

封装是面向对象程序设计方法的一个重要特性,所谓封装具有两方面的含义:一是将有关的数据和操作代码封装在一个对象中,各个对象相对独立、互不干扰。二是将对象中某些数据与操作代码对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外界隐蔽的做法称为信息隐蔽。信息隐蔽有利于数据安全,防止无关人员访问和修改数据。

【1.7】什么是继承?请举例说明。

【解】

继承所表达的是对象类之间的相关关系,这种关系使得某类对象可以继承另外一类对象的特征和能力。现实生活中,继承是很普遍和容易理解的。例如,我们继承了父母的一些特征,如种族、血型、眼睛的颜色等,父母是我们所具有的属性的基础。

图1-1所示是一个继承的典型例子:汽车继承的层次。

以面向对象程序设计的观点,继承所表达的是对象类之间相关的关系。这种关系使得某一类可以继承另外一个类的特征和能力。

图1-1 汽车继承的层次图

【1.8】若类之间具有继承关系,则它们之间具有什么特征?

【解】

若类之间具有继承关系,则它们之间具有下列几个特性:

(1)类间具有共享特征(包括数据和操作代码的共享)。

(2)类间具有差别或新增部分(包括非共享的数据和操作代码)。

(3)类间具有层次结构。

假设有两个类A和B,若类B继承类A,则类B包含了类A的特征(包括数据和操作),同时也可以加入自己所特有的新特性。这时,称被继承类A为基类或父类;称继承类B为A的派生类或子类。同时,我们还可以说,类B是从类A中派生出来的。

【1.9】什么是单继承、多继承?请举例说明。

【解】

从继承源上分,继承分为单继承和多继承。单继承是指每个派生类只直接继承了一个基类的特征。图1-2表示了一种单继承关系。它表示Windows操作系统的窗口之间的继承关系。

多继承是指多个基类派生出一个派生类的继承关系。多继承的派生类直接继承了不止一个基类的特征。例如,小孩喜欢的玩具车即继承了车的一些特性,还继承了玩具的一些特征,如图1-3所示。

图1-2 单继承关系

图1-3 多继承关系

【1.10】什么是多态性?请举例说明。

【解】

多态性也是面向对象程序的重要特征。它是指不同的对象收到相同的消息时产生不同的行为方式。例如,同样双击Windows系统桌面上的图标时,有的是打开多媒体播放器,有的是打开资源管理器。

利用多态性,用户只需发送一般形式的消息,而将所有的实现留给接收消息的对象。对象根据所收到的消息而做出相应的动作。

【1.11】传统程序设计方法的局限性主要有哪些?

【解】

传统程序设计方法的局限性主要有三个方面:

(1)传统程序设计开发软件的生产效率低下。

传统程序设计的生产方式仍是采用较原始的方式进行,程序设计基本上还是从语句一级开始。软件的生产中缺乏大粒度、可重用的构件,软件的重用问题没有得到很好的解决,从而导致软件生产的工程化和自动化屡屡受阻。传统程序设计的特点是数据与其操作分离,而且对同一数据的操作往往分散在程序的不同的地方。这样,如果一个或多个数据的结构发生了变化,那么这种变化将波及程序的很多部分甚至遍及整个程序,致使许多函数和过程必须重写,严重时会导致整个软件结构的崩溃。传统程序设计是面向过程的,其数据和操作相分离的结构,使得维护数据和处理数据的操作过程要花费大量的精力和时间,严重地影响了软件的生产效率。

总之,要提高软件生产的效率,就必须很好地解决软件的重用性、复杂性和可维护性问题。但是传统的程序设计是难以解决这些问题的。

(2)传统程序设计难以应付日益庞大的信息量和多样的信息类型。

当代计算机的应用领域已从数值计算扩展到了人类社会的各个方面,所处理的数据已从简单数字和字符发展为具有多种格式的多媒体数据(如文本、图形、图像、影像、声音等),描述的问题从单纯的计算问题到仿真复杂的自然现象和社会现象。随着计算机处理的信息量与信息类型的迅速增加,程序的规模日益庞大,复杂度不断增加,传统程序设计方法是无法应付的。

(3)传统的程序设计难以适应各种新环境。

当前,并行处理、分布式、网络和多机系统等已经或将是程序运行的主流方式和主流环境。这些环境的一个共同的特点是都具有一些有独立处理能力的结点,结点之间有通信机制,即以消息传递进行联络。显然传统的程序设计技术很难适应这些新环境。

【1.12】面向对象程序设计的优点主要有哪些?

【解】

面向对象程序设计的优点主要包括以下几个方面:

(1)可提高程序的重用性。

重用是提高软件开发效率的最主要的方法,面向对象程序设计能比较好地解决软件重用的问题。对象所固有的封装性和信息隐藏等机理,使得对象内部的实现与外界隔离,具有较强的独立性,它可以作为一个大粒度的程序构件,供同类程序直接使用。

(2)可控制程序的复杂性。

面向对象程序设计采用了数据抽象和信息隐藏技术,把数据及对数据的操作放在一个个类中,作为相互依存、不可分割的整体来处理。这样,在程序中任何要访问这些数据的地方都只需简单地通过传递信息和调用方法来进行,这就有效地控制了程序的复杂性。

(3)可改善程序的可维护性。

在面向对象程序设计中,对对象的操作只能通过消息传递来实现,所以只要消息模式即对应的方法界面不变,方法体的任何修改不会导致发送消息的程序修改,这显然对程序的维护带来了方便。另外,类的封装和信息隐藏机制使得外界对其中的数据和程序代码的非法操作成为不可能,这也就大大地减少了程序的错误率。

(4)能够更好地支持大型程序设计。

面向对象技术在数据抽象和抽象数据类型之上又引入了动态链接和继承性等机制,进一步发展了基于数据抽象的模块化设计,使其更好地支持大型程序设计。

(5)增强了计算机处理信息的范围。

面向对象程序设计方法模拟人类习惯的解题方法,代表了计算机程序设计的新颖的思维方法。用类来直接描述现实世界中的类型,可使计算机系统的描述和处理对象从数据扩展到现实世界和思维世界的各种事物,这实际上大大扩展了计算机系统处理的信息量和信息类型。

(6)很好地适应新的硬件环境。

面向对象程序设计中的对象、消息传递等思想和机制,与分布式、并行处理、多机系统及网络等硬件环境也恰好相吻合。面向对象的思想也影响到计算机硬件的体系结构,现在已在研究直接支持对象概念的面向对象计算机。这样的计算机将会更适合于面向对象程序设计,更充分地发挥面向对象技术的威力。