第一篇:面向对象技术引论(复习题带术语题答案)
一、概念与术语
1.对象:(1)从现实世界:问题的概念和抽象的或具有明确边界和意义的事物
(2)从数据世界:一组数据以施加在这组数据上的一组操作
(3)从系统观点:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,一个对象是由一组属性和对整个属性进行操作的一组服务构成的。(P19)
2.持久对象:生存期可以超越程序的执行时间而长期存在的对象。(P24)
2.主动对象(3种解释):(1)一个能够启动消息传递的对象。(2)一个能为其他对象提供服务的对象,能被拷贝成代理,并且需要并发控制。(3)其方法(操作)由自身状态的改变而激活。(P25)
3.被动对象:其内部的操作需要通过外部消息驱动才能执行的对象。(P25)
4.类:一组具有相同性质(属性和操作)的对象的抽象。(P20)
5.主动类:主动类的对象至少拥有一个进程或线程,因此它能够自主执行(P65)
6.接口:描述一个类或构件的一个服务的操作集(P64)
7.用况:用况是对业务过程所包含的一组动作序列的描述,系统执行这些动作将产生一个对特定的参与者有价值且可观察的结果。(P42)
8.协作:协作定义了一个交互,它是由一组共同工作以提供某协作行为的角色和其他元素构成的一个群体,这些协作行为大于所有元素的各自行为的综合(P64)
9.构件:构件是系统中物理的、可替代的部件,它遵循且提供一组接口的实现。(P65)
10.节点:节点也是物理的,是在系统运行时存在的物理元素,它表示了一种可计算的资源,通常至少有一些记忆能力和处理能力。(P65)
11.一般类和12.特殊类:如果类A具有类B的全部属性和服务(操作),而且具有自己特有的某些属性和服务,则类A叫做类B的特殊类,B叫做A的一般类。(P22)
13.关联(关系):事物(类)之间的一种结构关系,或者说是对象之间连接的抽象,用来描述对象之间的相互作用(P67)
14.关联类:关联类是一种具有关联特性和类特性的建模元素,可以将其看出是具有类特性的关联,或者具有管理特征的类(P116)
15.依赖(关系):依赖是两个事物之间的一种语义关系,其中的一个事物的改变会影响另一个事物,反之未必(P106)
16.泛化(关系):泛化是一种“特殊/一般”关系,即特殊事物和一般事物之间的关系。(P108)
17.实现(关系):类元之间的语义关系(P16)
18.链和链属性:对象之间的关联或相互作用表现出不同的类的对象的实例之间的实际的或概念上的联系,称为链。链属性:??(P110)
19.聚合:聚合用来表示事物时间的“整体/部分”关系,“整体”事物是一个较大的事物,它是由多个”部分“事物组成的。(P113-114)
20.问题域:是指特定应用系统的应用领域,即在现实世界中由该系统进行处理的业务范围。(P47)
21.系统责任:指系统应该具备的职能。(P47)
22.消息:消息定义为向对象发出的服务请求(P23和P127)
23.交互:交互是发生在对象之间后对象内部的消息传递行为(P66)
24.事件:一个触发行为成为一个事件,换句话说,所谓事件是指特定时刻内发生的动作。(P139)
25.事件流:(P84)
26.状态:指在对象的生命期中的一个条件或状况(通过属性值体现),在此期间,对象将满足某些条件、执行某些活动或等待某些事件。(p141)
27.状态机:状态机描述了一个对象或一个交互在生命期内响应事件所经历的状态序列,即描述其状态变迁。(P66)
28.封装:封装是对拥有结构和行为的一个对象的元素进行划分的过程,封装完成抽象的契约接口和对象实施的分离(P28)
29.继承:特殊类拥有一般类的全部属性和服务(操作),称为特殊类对一般类的继承(P29)多态:在一般类中定义的属性被特殊类继承之后,可以具有不同的数据类型;同理,一般类中定义的操作,可以在特殊类中具有不同的实现方法。(P31)
31.抽象:抽象即指通过思考进行分离的行为。另一种解释:表示某事物的本质特征(P27)
32.角色:当一个类位于关联的某一端时,该类(的某些实例)就在这个关系中扮演了特定的角色。(这个算??)(P111)
33.限定词(修饰关联):限定词是关联的一个特定的属性,它的值划分了一个关联与一个对象相关的对象集。(p116)
34.UML的规则(命名、范围、可见性、完整性、执行):P70-P71太多了~不想打~
35.UML的公共机制(详述、修饰、通用划分、扩展机制(构造型、标记值、约束))
36.OOPL:面向对象的编程语言,OOD:面向对象设计范式,OOA:面向对象分析方法
37.准则包括标准与原则,模块化设计的标准包括:可分解性、组合性、可理解性、连续性、保护性;设计上应遵循的原则为:语言模块单元、接口很少、小接口、显示接口、信息隐蔽等。
38.面向对象的四个基本要素:面向对象系统是由对象组成的、组成系统的对象抽象成类、类之间存在泛化关系,此种关系支持继承、对象之间通过消息获取对方的服务。
39.应用开发过程六个阶段:需求描述、分析、设计、实现、测试、维护。
40.UML对软件密集型系统的制品进行下述工作:可视化、详述、构造、文档化。41.UML三大建模元素:事物、关系、图,事物分为:角色、实现结构。结构事物、行为事物、分组事物、注释事物,结构事10.简述描述类的基本特征(名称、属性等)并举例物分为:类、接口、协作、用况、主动类、构件、节说明之。点。名称:一个字符串;属性:已被命名的类的42.提交一个应用系统的过程包括:计划和细化、构造、特性;操作:一个服务的实现,该服务可以由类的任实施。何对象,甚至其他类的对象所请求,以影响其行为; 职责:类的契约或责任。
二、思考题 11.为什么“继承”可以简化对问题的认识? 这是因为在分析问题时,运用继承手段至少1.为什么应用对象技术可以改变软件制造(生产)可以从数量上减少必须理解和分析的不同情况。方式? 由人工集约方式改变成资源集约方式,由重复性12.列举引起需求变化的主要因素,面向对象方法如何应对需求的不断变化? 的编程劳动变成基于组件的系统组装,从而带来软件生产问题域本身在系统开发过程中发生变化、用户因效率的大幅度提高。素、竞争因素、经费因素、技术支持。2.试述建模的重要性,为什么建模可以降低系统实冻结需求法、以系统中最稳定的部分作为系统的基本单位现的复杂度。(对象)。建模是开发优秀软件所有活动的核心部分,其目的是把所要设计的结构和系统的行为沟通起来,并对系统13.简述软件维护的主要工作,并说明其重要性。主要工作:对系统潜在的错误进行检测和改的体系结构进行可视化和控制。建模是为了更好的理解正正;不断地面对用户的新要求以及为适应新环境对系在构造的系统,并经常提供简化和复用的机会。建模还可统进行改进与增强。以管理风险。一个成功的软件组织有很多成功的因素,其中共同的一点就是对建模的采用。模型可以提高系统的可测试性。提高可交流性。增强开发过程的可视性,使得分析和设计思路、设计过程可视化。降低实现的复杂度。通过将复杂系统的重要部分分解成一次能理解与处理的多个子部分,可以降低实现的复杂性。人对复杂问题的理解能力是有限的,通过建模,缩小所研究问题的范围,一次只着重研究它的一个方面,这就是所谓的“分而治之”“各个击破”。3.为什么面向对象方法能较好地管理复杂性并增强伸缩性。管理复杂性的一个好办法就是“分而治之”。“分”就是对应用领域的分解,面向对象方法强调以客观世界的事物为基础,把某一领域分割成各种对象,这显然比自顶向下进行功能分解更自然、合理。“治”的基本方法就是:采用封装技术对被分割的事物进行包装,以简化接口、减少事物之间不必要的联系。利用事物之间的泛化管子构造继承机制以获得重用。可用性和可扩展性意味着复杂系统可以由简单系统组合而成,并且复杂系统可以采用“迭代”方式,逐步增量形成。基于对象的分块技术也有助于解决过程的伸缩性问题。4.何谓“软件复用”,为什么说面向对象技术对“软件复用”提供了卓有成效的支持? 软件重用是将已有软件的各种有关知识用于建立新的软件,以缩减软件开发和维护的花费。包括分析模型、设计模型、代码以及测试用例、测试信息等等的复用。面向对象技术使软件重用技术更加完善和规范,对象的重要特性。:抽象、封装、继承和多态都从不同角度支持软件重用:抽象使得对象组件更具一般化,也即充分考虑到对象自身的性质、性能和应用环境的复杂性等多方面的要求,以此获得通用化和标准化方面的保证。封装允许开发人员将对象视为“黑匣子”,只需通过界面去理解、引用和操作对象,而不必关心其实现细节。继承使得基于类的抽象层次和泛化结构的代码重用成为可能,也即通过泛化关系使得特殊类可以共享一般类的性质。5.“用况驱动的、迭代式的、增量”的开发方法的要点、优点、时间盒。要点:①软件开发过程要经历若干个开发周期,每个周期都包含:分析、设计、实现和测试等活动。②在经过一个初步的计划和细化阶段后,开发进入由一系列开发周期组成的系统构造阶段,所以迭代主要发生在构造阶段,当然也包含部分实施,因此严格讲,构造发生在构造及实施阶段。③在每个开发周期中,通过增加新的功能使系统得以扩充。④每个开发周期只针对比较小的一部分需求,它要经历分析、设计、实现和测试等活动。每个开发周期完成后,系统都获得一定程度的扩充。开发周期一般是以用况为单位组织的。优点:①因为每个开发周期只针对比较小的一部分需求,所以就可以比较好的解决由于一个开发过程太庞大、复杂使得开发人员无从下手的问题,也即能够比较有效地管理复杂性。②因为每个开发周期只快速实现系统的一小部分,所以在开发过程的早期就能够获得反馈信息。用户的反馈信息越早越好,尽早听到和采纳用户的意见,可以少犯错误。时间盒即给开发周期限定时间,开发周期中的所用工作都必须在这个时间内完成。6.“计划和细化”阶段的主要工作和主要活动。主要工作:初期概念的形成、为做出各种项目选择所进行的调查研究、需求的规格化描述等。主要活动:定义计划草案、编制初步调查报告、定义需求、在术语表中记录术语、实现原型、定义用况、定义概念模型草案、定义系统结构草案、精华计划。7.“构造阶段”的主要工作和主要活动。构造阶段包括一系列重复的开发周期,每个开发周期主要工作:精华计划、同步制品、分析、设计、实现、测试等。在这些开发周期中,系统得到了扩展和完善。构造阶段的最终目标是得到一个能正确符合需求的软件系统。8.何谓链属性,试述链属性不应置入关联两端的某一对象类中作为其属性的理由,请举例说明之。由于关联特性与存在关联关系的两个类有关,因此建模时经常会将这些属性随意地置入某一个类中,当成类的属性。关联的特性是与被关联的两个或多个类有关的那些属性,这些属性不是从属于单个类的,因而不应该随意置入某个类中。9.系统分析阶段如何识别类和排除虚假类?(分别简述语法分析法和现实分析法的要点)。现实分析法:确定问题陈述所涉及的哪些活动是与需求密切相关的,分析这些活动涉及到哪些具体的事物、概念、过程,遵循哪些规则等,它们都可能是系统内部的对象类。语法分析发:在问题陈述中,对象类通常对应于名词或名词词组,因此从问题陈述中找出所有的名词或名词词组,就得到大多数的候选类,运用排除法可以排除虚假的类,就获得确定的类组。虚假类:冗余类、无关类、模糊类、属性、操作、
第二篇:面向对象技术引论(复习题)[参考解答]
《面向对象技术引论》复习题
一、概念与术语
1.对象:
在现实世界中,对象定义为:问题的概念和抽象的或具有明确边界和意义的事物;在数据世界中,对象定义为:一组数据以及施加于这组数据上的一组操作;
从系统的观点出发,我们可以给对象作如下定义:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位(单元),一个对象是由一组属性和对这组属性进行操作的一组服务构成的。
2.持久对象:
生存期可以超越程序的执行时间而长期存在的对象称为持久对象。换句话说:一个对象在程序运行结束后仍继续存在,则称该对象是持久的。
2.主动对象:
主动对象是一组属性和一组操作(服务)的封装体,其中至少有一个操作不需要接收消息就能主动执行(称为主动服务)。
3.被动对象:
被动对象(Passive object)是指其内部的操作需要通过外部消息驱动才能执行的对象。可以看出被动对象必须工作在消息驱动环境中。
4.类:
定义1一组具有相同性质(属性和操作)的对象的抽象。
定义2类是对一组具有相同属性、操作、关系和语义的对象的描述。
定义3具有相同属性和容许操作的一组对象的一般描述称为类。
5.主动类:
主动类的对象至少拥有一个进程或线程,因此它能够自主执行(能够启动控制活动)。注意:主动类的对象所描述的元素的行为与其他元素的行为并发,这是它与一般类的唯一区别。
6.接口:
接口是描述一个类或构件的一个服务的操作集。因此,接口描述元素的外部可见行为。接口描述了一组操作的规格,而不是操作的实现。图形上,用一个带有名称的圆表示接口。
7.用况:
用况是对一组动作序列的描述,系统执行这些动作将产生一个对特定的参与者有价值而且可观察的结果。用况用于对系统语境和系统需求建模。图形上,用一个包含名称的实线椭圆表示用况。
8.协作:
协作定义了一个交互,它是由一组共同工作以提供某协作行为的角色和其他元素构成的一个群体,这些协作行为大于所有元素的各自行为的综合。因此协作有结构、行为和维度。图形上,用一个仅包含名称(协作名)的虚线椭圆表示协作。
9.构件:
构件是系统中物理的、可替代的部件,它遵循且提供一组接口的实现。构件是物理的、可替代的部件。
10.节点:
节点也是物理的,是在系统运行时存在的物理元素,它表示了一种可计算的资源,通常至少有一些记忆能力和处理能力。
11.一般类 /12.特殊类:
如果类A具有类B的全部属性和服务,而且具有自己特有的某些属性和服务,则类A叫做类B的特殊类,类B叫做的类A的一般类。两者之间的关系称为“泛化”。可以看出一般
类具有父类的特征,而特殊类具有子类的特征,特殊类可以共享一般类的性质。
13.关联(关系)
关联是对象之间连接(链)的抽象,用来描述对象之间的相互作用。
14.关联类:
关联类是一种具有关联特性和类特性的建模元素,可以将关联类看成是具有类特性的关联,或是具有关联特性的类。
15.依赖(关系):
依赖是两个事物之间的一种语义关系,其中一个事物(独立事物)的改变会影响另一事物(依赖事物)的语义。
16.泛化(关系):
泛化是事物(类)之间的一种一般/特殊关系,也即一般事物(一般类)和特殊事物(特殊类)之间的关系。
17.实现(关系):
是类元之间的语义关系。
18.链和链属性:
关联或相互作用表现出不同的类的对象实例之间的实际的或概括上的联系,称为“链”;
19.聚合:
聚合用来表示事物之间的“整体/部分”关系,“整体”事物是一个较大的事物,它是由多个“部分”事物(较小的事物)组成的。
20.问题域:
问题域是指特定应用系统的应用领域,即在现实世界中由该系统进行处理的业务范围。
21.系统责任:
系统责任是指系统应该具备的职能,通俗地讲,即系统除能做什么之外,还应该作些什么。
22.消息:
在面向对象语境中,消息定义为向对象发出的服务请求(要求对象执行它其中的一个操作的请求)。
23.交互:
交互是发生在对象之间或对象内部的消息传递行为,它由在特定语境中共同完成一定任务的一组对象之间交换的消息组成。
24.事件:
25.事件流:
26.状态:
27.状态机:
状态机描述了一个对象或一个交互的生命内响应事件所经历的状态序列,即描述其状态变迁。
28.封装:
封装是对拥有结构和行为的一个抽象(对象)的元素进行划分的过程,封装完成抽象的契约接口和对象实施的分离。
29.继承:
特殊类拥有一般类的全部属性和服务(操作),称作特殊类对一般类的继承。多态:
同一属性或操作在一般类和各个特殊类中具有不同的意义。
31.抽象:
即指通过思考进行分离的行为(CED).思考就是对事物性质进行观察与分析,而分离则是对分析结果中的一些细节的剥离,从而得到事物的最基本的性质。
32.角色:
角色是关联中(靠近它的)一端的类对另一端的类呈现的职责,可以说角色是关联的作用者。
33.限定词(修饰关联)
限定词是关联的一个特定的属性(而不是工作台或工件的属性,其实该属性与工作台及工件都有关,是使二者发生关联的数据之一),它的值划分了通过一个关联与一个对象相关的对象集。
34.UML的规则(命名、范围、可见性等):
1)命名:给事物、关系和图等建模元素命名。
2)范围:给一个名称以特定含义的语境。
3)可见性:表示元素的名称如何被其他元素看到和使用。
4)完整性:保证事物正确、一致地相互联系,体现事物之间的合理性和一致性。5)执行:运行或模拟动态模型的含义是什么。
35.UML的公共机制(详述、修饰、扩展机制(构造型、标记值、约束)):
1)详述:详述是对UML图形符号的补充,对图形表示法的每一部分(图形符号)都可以附上一个详述,该详述提供了对构造块的语法和语义的文字叙述。
2)修饰:修饰是附加到元素的基本表示法上的文字或图形项,用于对元素规格说明的细节进行可视化。
3)通用划分:方法一:对类和对象的划分;方法二:接口和实现的分离。
4)扩展机制 :三种机制来扩展语言的语法和语义,分别是:构造型(表示新的建模元素)、标记值(表示新的额建模元素属性)和约束(表示新的建模元素语言)。
二、思考题
1.为什么应用对象技术可以改变软件制造(生产)方式?
2.试述建模的重要性,为什么建模可以降低系统实现的复杂度。
3.为什么面向对象方法能较好地管理复杂性并增强伸缩性。
4.何谓“软件复用”,为什么说面向对象技术对“软件复用”提供了卓有成效的支持?
5.“用况驱动的、迭代式的、增量”的开发方法的要点、优点、时间盒。
6.UML的三大建模元素(事物、关系、图)、各种结构事物的定义和用途。
7.“计划和细化”阶段的主要工作和主要活动。
8.“构造阶段”的主要工作和主要活动。
9.面向对象有哪些要素?为什么说“封装”是其最重要的要素?
10.何谓链属性,试述链属性不应置入关联两端的某一对象类中作为其属性的理由,请举例说明之。
11.系统分析阶段如何识别类和排除虚假类?(分别简述语法分析法和现实分析法的要点)。
12.系统分析阶段如何识别关联和排除虚假关联?(分别简述语法分析法和现实分析法的要点)。
13.简述描述类的基本特征(名称、属性等)并举例说明之。
14.软件维护的主要工作是什么,为什么说每一次维护可能又是一个较小的应用开发过程?
15.为什么“继承”可以简化对问题的认识?
16.面向对象系统中通常存在着持久对象、主动对象、和被动对象等三种对象,给出这三种对象的定义,并举例说明之。
17.解释“多态性”的基本含义,为什么“多态性”的实际应用必须建立在类的一般化层次结构上?
18.列举引起需求变化的主要因素,面向对象方法如何应对需求的不断变化?
19.何谓“多态性”,试举例说明“多态性”的应用。
20.简述软件维护的主要工作,并说明其重要性。
三、设计部分
1.根据给定的领域和场景写出问题陈述、建立用况模型,针对指定的用况,写出事件流。
2.设计为词汇建模的类图、为数据库建模的类图、为简单协作建模的类图。
3.按时间顺序对控制流建模型的步骤,以指定用况作为交互语境设计顺序图。
4.按对象组织对控制流建模型的步骤,以指定用况作为交互语境设计协作图。
5.对对象的生命期建模的策略和步骤,为指定类设计状态图。
第三篇:9、软件工程面向对象方法学引论总结
1. 面向对象方法学的定义和对象方法学的要点。
面向对象方法把数据和行为看成同等重要,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。面向对象方法学具有下述4个要点。
(1)把对象(object)作为融合了数据及在数据上的操作行为的统一的软件构件。面向对象程序是由对象组成的,程序中任何元素都是对象,复杂对象由比较简单的对象组合而成。
(2)把所有对象都划分成类(class)。每个类都定义了一组数据和一组操作,类是对具有相同数据和相同操作的一组相似对象的定义。
(3)按照父类(或称为基类)与子类(或称为派生类)的关系,把若干个相关类组成一个层次结构的系统(也称为类等级)。在类等级中,下层派生类自动拥有上层基类中定义的数据和操作,这种现象称为继承。
(4)对象彼此间仅能通过发送消息互相联系。
也就是说,对象的所有私有信息都被封装在该对象内,不能从外界直接访问,这就是通常所说的封装性。
2. 面向对象方法学的优点是:(1)与人类习惯的思维方法一致(2)稳定性好(3)可重用性好
(4)较易开发大型软件产品(5)可维护性好
3. 对象的概念,对象的特点?
对象是封装了数据结构及可以施加在这些数据结构上的操作的封装体,这个封装体有可以惟一地标识它的名字,而且向外界提供一组服务(即公有的操作)。特点:
① 以数据为中心。不设置与数据无关的操作;
② Object主动处理而不被动地等待被处理,外部只能通过message请求操作;
③ 实现了数据封装。具有黑盒性:外部操作时,无须知道该object内部的数据结构及算法; ④ 具有并行性:不同object各自独立地处理自身数据,彼此间仅通过传递message完成通信;
⑤ 模块独立性好:内聚强(①)、耦合松(③ ④)
4. 类、实例、消息、方法、属性、封装、继承、多态性、重载的定义。
类:是对具有相同数据和相同操作的一组相似对象的定义。
实例:是由某个特定的类所描述的一个具体的对象。
消息:是要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明。
方法:是对象所能执行的操作,也就是类中所定义的服务。
属性:是类中所定义的数据。
5. 模型的概念,面向对象建模的概念。要建立哪些模型?
所谓模型,就是为了理解事物而对事物做出的一种抽象,是对事物一种无歧义的书面描述。建立三种模型:
① 描述系统数据结构的对象模型(object model).② 描述系统控制结构的动态模型(dynamic model).③ 描述系统功能的功能模型(function model).6. 对象模型是表示静态的、结构化的系统的数据性质。类图是描述类及类与类之间的静态关系。包括定义类、定义属性、定义服务。7. 表示关系的符号:类与类之间通常有关联(Association)、泛化(Generalization)、聚合(Aggregation)、组合(Composition)、依赖(Dependency)等关系。
8. 动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列
关联 泛化 聚合 组合 依赖
9.Association
Generalization
Aggregation
Composition
Dependency
动态模型三要素:
① 事件(event):引发 object 状态改变的控制信息(瞬时)。② 状态(status):即 object 的 attributes 所处的情形(可持续)。③ 行为(action): Object 要达到某种 status 所做的操作(耗时)。10.功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此更直接地反映了用户对目标系统的需求。功能模型由一组数据流图组成。
在面向对象方法学中,数据流图远不如在结构分析、设计方法中那样重要。11.UML提供的用例图也是进行需求分析和建立功能模型的强有力工具。在UML中把用用例图建立起来的系统模型称为用例模型。
用例模型描述的是外部行为者(actor)所理解的系统功能。用例模型的建立是系统开发者和用户反复讨论的结果,它描述了开发者和用户对需求规格所达成的共识。
第四篇:面向对象程序设计教程 答案
面向对象程序设计教程(C++语言描述)题解与课程设计指导
第1章
面向对象程序设计概论
一、名词解释 抽象封装消息 【问题解答】
面向对象方法中的抽象是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。
面向对象方法中的封装就是把抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。
消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。
二、填空题(1)目前有面向过程的结构化程序设计方法和面向对象的程序设计方法两种重要的程序设计方法。
(2)结构化程序设计方法中的模块由顺序、选择和循环3种基本结构组成。(3)在结构化程序设计方法中,程序可表示为程序=数据结构+算法; 而面向对象的程序设计方法,程序可表示为程序=对象+消息。(4)结构化程序设计方法中的基本模块是过程; 而面向对象程序设计方法中的基本模块是类。
(5)面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。
三、选择题(至少选一个,可以多选)
(1)面向对象程序设计着重于(B)的设计。A.对象B.类C.算法D.数据(2)面向对象程序设计中,把对象的属性和行为组织在同一个模块内的机制叫做(C)。
A.抽象 B.继承 C.封装 D.多态
(3)在面向对象程序设计中,类通过(D)与外界发生关系。A.对象 B.类 C.消息 D.接口
(4)面向对象程序设计中,对象与对象之间的通信机制是(C)。A.对象 B.类 C.消息 D.接口
(5)关于C++与C语言的关系的描述中,(D)是错误的。A.C语言是C++的一个子集 B.C语言与C++是兼容的
C.C++对C语言进行了一些改进 D.C++和C语言都是面向对象的
【结果分析】
C语言是面向过程的。C++语言是一种经过改进的更为优化的C语言,是一种混合型语言,既面向过程也面向对象。
(6)面向对象的程序设计将数据结构与(A)放在一起,作为一个相互依存、不可分割的整体来处理。A.算法 B.信息 C.数据隐藏 D.数据抽象(7)下面(A)不是面向对象系统所包含的要素。
A.重载 B.对象 C.类 D.继承 【结果分析】
面向对象=对象+类+继承+消息+多态(8)下面说法正确的是(BC)。
A.将数据结构和算法置于同一个函数内,即为数据封装 B.一个类通过继承可以获得另一个类的特性
C.面向对象要求程序员集中于事物的本质特征,用抽象的观点看待程序 D.同一消息为不同的对象接受时,产生的行为是一样的,这称为一致性 【结果分析】
面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。将数据结构和算法置于同一个类内,即为数据封装。同一消息为不同的对象接受时,产生的行为可能是不一样的,这称为多态性。(9)下面说法正确的是(AD)。
A.对象是计算机内存中的一块区域,它可以存放代码和数据 B.对象实际是功能相对独立的一段程序
C.各个对象间的数据可以共享是对象的一大优点
D.在面向对象的程序中,对象之间只能通过消息相互通信 【结果分析】
对象是计算机内存中的一块区域。在对象中,不但存有数据,而且存有代码,使得每个对象在功能上相互之间保持相对独立。对象之间存在各种联系,但它们之间只能通过消息进行通信。
四、判断题
(1)在高级程序设计语言中,一般用类来实现对象,类是具有相同属性和行为的一组对象的集合,它是创建对象的模板。(√)
(2)C++语言只支持面向对象技术的抽象性、封装性、继承性等特性,而不支持多态性。(×)【结果分析】
C++语言不仅支持面向对象技术的抽象性、封装性、继承性等特性,而且支持多态性。
(3)面向对象程序设计中的消息应该包含“如何做”的信息。(×)【结果分析】
消息是面向对象程序设计用来描述对象之间通信的机制。向对象“发送消息”只需告诉对象做什么,对象根据这个消息决定如何做。(4)一个消息只能产生特定的响应效果。(×)【结果分析】
当一个对象发出消息时,由于接收对象的类型可能不同,所以,它们可能做出不同的反应。这样,一个消息可以产生不同的响应效果,这种现象叫做多态。(5)类的设计和类的继承机制实现了软件模块的可重用性。(√)(6)C++语言和Java语言均不是一个纯正的面向对象的程序设计的语言。(×)【结果分析】
Java语言是一个纯正的面向对象的程序设计语言。(7)学习C++语言是学习面向对象的程序设计方法的唯一途径。(×)【结果分析】
程序设计方法是独立于具体程序设计语言的一种技术,学习C++语言是学习面向对象程序设计方法的重要途径之一。
(8)在C++语言中,类是支持数据封装的工具。(√)
五、简答题
(1)什么是结构化程序设计方法?它有哪些优点和缺点? 【问题解答】
结构化程序设计方法着眼于系统要实现的功能,从系统的输入输出出发,分析系统要做哪些事情,进而考虑如何做这些事情,自顶向下地对系统的功能进行分解,来建立系统的功能结构和相应的程序模块结构,有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。随着程序规模与复杂性的增长,这种面向过程的结构化程序设计方法存在明显的不足之处。首先是数据安全性问题。由于数据被每个模块所共用,因此是不安全的,一旦出错,很难查明原因。其次是可维护性及可重用性差。它把数据结构和算法分离为相互独立的实体,一旦数据结构需要改变时,常常要涉及整个程序,修改工作量极大并容易产生新的错误。每一种相对于老问题的新方法都要带来额外的开销。另外,图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。
(2)什么是面向对象程序设计方法?它有哪些优点? 【问题解答】
面向对象的程序设计方法中,将程序设计为一组相互协作的对象而不是一组相互协作的函数。在程序中,属性用数据表示,用来描述对象静态特征; 行为用程序代码实现,用来描述对象动态特征。可见,在面向对象的程序设计方法中,对象是数据结构和算法的封装体。对象之间存在各种联系,它们之间通过消息进行通信。程序可表示为:
程序=对象+消息
在面向对象程序设计中应着重于类的设计。类正是面向对象语言的基本程序模块,通过类的设计来完成实体的建模任务。类通过一个简单的外部接口与外界发生关系。一个类中的操作不会处理到另一个类中的数据,这样程序模块的独立性、数据的安全性就有了良好的保障。程序的执行取决于事件发生的顺序,由顺序产生的消息来驱动程序的执行。不必预先确定消息产生的顺序,更符合客观世界的实际。并且面向对象程序设计方法提供了软件重用、解决大问题和复杂问题的有效途径,具有抽象性、封装性、继承性和多态性等特点。
(3)结构化程序设计方法与面向对象程序设计方法在对待数据结构和算法关系上有 什么不同? 【问题解答】
结构化程序设计方法中,把数据结构和算法分离为相互独立的实体; 而在面向对象程序设计中,数据结构和算法封装在一起,结合成一个独立的单位,即对象,并尽可能隐蔽对象的内部细节。对象的私有属性只能由这个对象的行为来读取和修改,与外部的联系通过公有行为充当外部接口。第 2 章
从C到C++
面向对象程序设计教程(C++语言描述)题解与课程设计指导
第2章 从C到 C++
一、名词解释
引用内联函数重载函数 【问题解答】
所谓引用就是给对象取一个别名,使用该别名可以存取该对象。换句话说是使新对象和原对象共用一个地址。
内联函数是使用inline关键字声明的函数。
重载函数指在同一个作用域内名字相同而参数不同的函数。重载函数通常用来对具有相似行为而数据类型或数据个数不同的操作提供—个通用的名称。
二、填空题
(1)一般情况下,用C++语言编写的程序是由函数加上类组成的。(2)C++有两种注释符号,一种是//,另一种是 /*„„*/。
(3)使用C++风格的输入输出,在程序中必须包含头文件“iostream”。(4)cin是预定义的标准输入流对象,>>是输入操作符,也称提取运算符。(5)cout是预定义的标准输出流对象,<<是输出操作符,也称插入运算符。(6)指针的值是它所指向那个对象的地址值。指针的类型是它所指向对象的类型。指针的内容便是它所指向对象的值。
(7)C++使用运算符&来定义一个引用,对引用的存取都是对它所引用的对象的存取。(8)当一个函数调用出现在函数定义之前时,必须先用函数原型对函数进行声明。
(9)C++有值传递和引用传递两种参数传递机制。(10)使用关键字inline声明的函数称为内联函数。(11)运算符new用于进行动态内存分配,运算符delete用于释放动态分配的内存。
(12)下面程序的输出结果为x=10,y=10;
x=100,y=100。
#include
using namespace std;
int main()
{
int x=10,&y=x;
cout<<“x=”< int *p=&y; *p=100; cout<<“x=”< return 0; } 三、选择题(至少选一个,可以多选) (1)在整型指针变量p2、p3的定义中,错误的是(A)。A.int p1,*p2,p3;B.int*p2,p1,*p3;C.int p1,*p2=&p1,*p3;D.int*p2,p1,*p3=&p1;【结果分析】 指针定义的具体格式如下所示: <类型> *<指针名1>,*<指针名2>,„; (2)若有定义“double xx=3.14,*pp=&xx; ”,则*pp等价于(A.&xxB.*xxC.3.14D.xx 【结果分析】 pp指向xx所在的内存单元,这样*pp和xx等价。(3)下面对引用的描述中(C)是错误的。A.引用是某个变量或对象的别名 B.建立引用时,要对它初始化)。C C.对引用初始化可以使用任意类型的变量 D.引用与其代表的对象具有相同的地址 【结果分析】 所谓引用就是给对象取一个别名,使用该别名可以存取该对象,所以对引用初始化必须使用同类型的变量。 (4)函数没有返回值的时候,应该选择(A)的函数类型。A.void B.int C.不确定 D.float(5)在函数的定义格式中,下面各组成部分中,(D)是可以省略的。A.函数名 B.函数体 C.返回值类型 D.函数参数 【结果分析】 函数的定义可以缺省形式参数,此时称为无参函数。 (6)对重载的函数来说,下面叙述不正确的是(D)。A.参数的类型不同 B.参数的顺序不同 C.参数的个数不同 D.参数的个数、类型、顺序都相同,但函数的返回值类型不同 【结果分析】 对重载的函数来说,编译系统将根据函数参数的类型和个数来判断使用哪一个函数,所以重载函数参数的个数、类型、顺序不能都相同。 (7)下列有关设置函数参数默认值的描述中,(D)是正确的。A.对设置函数参数默认值的顺序没有任何规定 B.函数具有一个参数时不能设置默认值 C.默认参数要设置在函数的原型中,而不能设置在函数的定义语句中 D.设置默认参数可使用表达式,但表达式中不可用局部变量 【结果分析】 在C++中,在函数原型中可以为一个或多个参数指定默认值。对函数参数设置默认值要注意以下几点。◆若没有声明函数原型,参数的默认值可在函数定义的头部进行设置,否则必须在函数原型中进行设置。 ◆在一个指定了默认值的参数右边不能出现没有指定默认值的参数。◆设置默认参数可使用表达式,但表达式中不可用局部变量。(8)下面说法正确的是(BC)。A.所有的函数都可以说明为内联函数 B.具有循环语句、switch语句的函数不能说明为内联函数 C.使用内联函数,可以加快程序执行的速度,但会增加程序代码的大小 D.使用内联函数,可以减小程序代码大小,但使程序执行的速度减慢 【结果分析】 内联函数主要是解决程序的运行效率问题。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了程序运行的时间,但会增加程序代码的大小。它是以空间换取时间,因此内联函数适用于功能不太复杂,但要求被频繁调用的函数。 (9)一个函数功能不太复杂,但要求被频繁调用,应选用(A)。A.内联函数 B.重载函数 C.递归函数 D.嵌套函数(10)C++对C语言做了很多改进,下列描述中使得C语言发生了质变,即从面向过程变成面向对象的是(D)。A.增加了一些新的运算符 B.允许函数重载,并允许设置默认参数 C.规定函数说明必须用原型 D.引进了类和对象的概念 【结果分析】 面向对象=对象+类+继承+消息+多态 四、判断题 (1)C++程序中,不得使用没有定义或说明的变量。(√)(2)使用const说明常量时,可以不必指出类型。(×)【结果分析】 如果用const 定义的是一个整型常量,则类型说明符int可以省略。(3)引用被创建时可以用任意变量进行初始化。(×)【结果分析】 对引用初始化必须使用同类型的变量。 (4)一个返回引用的调用函数可以作为左值。(√)(5)函数可以没有参数,也可以没有返回值。(√)(6)没有参数的两个函数是不能重载的。(√)(7)函数可设置默认参数,但不允许将一个函数的所有参数都设置为默认参数。(×) 【结果分析】 函数可设置默认参数,且允许将一个函数的所有参数都设置为默认参数。(8)运算符new分配的空间由运算符delete释放。(√) 五、简答题 (1)名字空间的用途是什么? 【问题解答】 名字空间用来防止命名的冲突。(2)引用有何用处? 【问题解答】 除了独立引用外,在C++程序中,引用的主要用途是用作函数参数和函数的返回值。 (3)比较值调用和引用调用的相同点与不同点。【问题解答】 在值调用机制中,作为实参的表达式的值被复制到由对应的形参名所标识的一个对象中,作为形参的初始值。函数体对形参的访问、修改都是在这个标识对象上操作的,与实参无关,即数据的传递是单向的。 使用引用作函数的形参时,调用函数的实参要用变量名。实参传递给形参,相当于在被调用函数中使用了实参的别名。于是,在被调用函数中对形参的操作实质是对实参的直接操作,即数据的传递是双向的。(4)内联函数有什么作用?它有哪些特点? 【问题解答】 内联函数是使用inline关键字声明的函数。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了程序运行的时间。使用内联函数应注意以下几点。◆递归函数不能定义为内联函数。 ◆内联函数一般适合于不含有switch和while等复杂的结构且只有1~5条语句的小函数,否则编译系统将该函数视为普通函数。 ◆内联函数只能先定义后使用,否则编译系统也将该函数视为普通函数。◆对内联函数也不能进行异常接口声明。(5)函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗? 【问题解答】 不必一致。所有的参数是根据位置和类型而不是名字来区分的。(6)重载函数时通过什么来区分? 【问题解答】 编译系统将根据函数参数的类型和个数来判断使用哪一个函数。 六、程序分析题(写出程序的输出结果,并分析结果) #include using namespace std; int main() { int num=50; int& ref=num; ref=ref+10; cout<<“num=”< num=num+40; cout<<“ref=”< return 0;} 【输出结果】 num=60 ref=100 【问题分析】 本题主要考查引用的含义。【结果分析】 程序首先定义一个int类型的对象num,并给它赋初始值50。然后又定义了一个int类型的引用ref,并将它和num相联系。这样,无论是对num还是对ref进行操作,实际上都是对那个一开始放着50的物理单元的内容进行操作。 七、程序设计题 写出一个完整的C++程序,使用系统函数pow(x,y)计算xy的值,注意包含头文件cmath。【问题分析】 本题主要考查简单的输入输出和标准库函数的调用方法。【解题思路】 ① 由于要用到系统函数pow(x,y),所以要包含头文件cmath。 ② 要计算xy的值,首先必须知道x和y的值。为了程序的通用性,最好通过交互的方式输入x和y的值。【参考程序】 // xt2_1.cpp #include #include using namespace std; int main() { float x,y; cout<<“please input 2 floats to x,y:”; cin>>x>>y; float z=pow(x,y); cout<<“pow(”< return 0;} 【输出结果】 please input 2 floats to x,y:3.1 2 pow(3.1,2)=9.61 第 3 章 类与对象 面向对象程序设计教程(C++语言描述)题解与课程设计指导 第3章 类 与 对 象 一、填空题(1)类定义中关键字private、public和protected以后的成员的访问权限分别是私有、公有和保护。如果没有使用关键字,则所有成员默认定义为private权限。具有public访问权限的数据成员才能被不属于该类的函数所直接访问。(2)定义成员函数时,运算符“∷”是作用域运算符,“MyClass∷”用于表明其后的成员函数是在“MyClass类”中说明的。 (3)在程序运行时,通过为对象分配内存来创建对象。在创建对象时,使用类作为样板,故称对象为类的实例。 (4)假定Dc是一个类,则执行“Dc a[10],b(2)”语句时,系统自动调用该类构造函数的次数为11。【结果分析】 创建10个数组元素需调用构造函数10次,创建对象b需调用构造函数1次,所以系统自动调用该类构造函数的总次数为11。 (5)对于任意一个类,析构函数的个数最多为1个。 (6)delete运算符通常用于实现释放该类对象中指针成员所指向的动态存储空间的任务。(7)C++程序的内存格局通常分为4个区: 数据区、代码区、栈区和堆区。(8)数据定义为全局变量,破坏了数据的 封装性; 较好的解决办法是将所要共享的数据定义为类的 静态成员。 (9)静态数据成员和静态成员函数可由 任意访问权限许可的函数访问。(10)友元函数和 友元类统称为友元。(11)友元的正确使用能提高程序的效率,但破坏了类的封装性和数据的隐蔽性。(12)若需要把一个类A定义为一个类B的友元类,则应在类B的定义中加入一条语句: friend class A。 二、选择题(至少选一个,可以多选)(1)以下不属于类访问权限的是(B)。A.public B.staticC.protectedD.private 【结果分析】 类的访问权限有public、protected 和private。(2)有关类的说法不正确的是(BC)。A.类是一种用户自定义的数据类型 B.只有类的成员函数才能访问类的私有数据成员 C.在类中,如不做权限说明,所有的数据成员都是公有的 D.在类中,如不做权限说明,所有的数据成员都是私有的 【结果分析】 类是一种用户自定义的数据类型,类中成员均具有一种访问权限。关键字public、protected 和private以后的成员的访问权限分别是公有、保护和私有的,所有成员默认定义为private的。 私有成员是被隐藏的数据,只有该类的成员函数或友元函数才可以访问它。(3)在类定义的外部,可以被任意函数访问的成员有(C)。A.所有类成员 B.private或protected的类成员 C.public的类成员 D.public或private的类成员 【结果分析】 类是一种用户自定义的数据类型,类中成员均具有一种访问权限。公有成员定义了类的外部接口。私有成员是被隐藏的数据,只有该类的成员函数或友元函数才可以引用它。保护成员具有公有成员和私有成员的双重性质,可以被该类或派生类的成员函数或友元函数引用。可见在类定义的外部,可以被任意函数访问的成员是public的类成员。 (4)关于类和对象的说法(C)是错误的。A.对象是类的一个实例 B.任何一个对象只能属于一个具体的类 C.一个类只能有一个对象 D.类与对象的关系和数据类型与变量的关系相似 【结果分析】 C++语言的类就是一种用户自己定义的数据类型,类和对象的关系就相当于基本数据类型与它的变量的关系,所以任何一个对象只能属于一个具体的类,但一个类可以有多个对象。(5)设MClass是一个类,dd是它的一个对象,pp是指向dd的指针,cc是dd的引用,则对成员的访问,对象dd可以通过(B)进行,指针pp可以通过(D)进行,引用cc可以通过(B)进行。 A.∷ B..C.& D.->(6)关于成员函数的说法中不正确的是(C)。A.成员函数可以无返回值 B.成员函数可以重载 C.成员函数一定是内联函数 D.成员函数可以设定参数的默认值 【结果分析】 与普通函数不同的是,成员函数是属于某个类的。成员函数的实现,可以放在类体内,也可以放在类体外。在类体外实现的成员函数不再是内联函数。(7)下面对构造函数的不正确描述是(B)。A.系统可以提供默认的构造函数 B.构造函数可以有参数,所以也可以有返回值 C.构造函数可以重载 D.构造函数可以设置默认参数 【结果分析】 构造函数不能指定返回类型,即使是void类型也不可以,当然不可能有返回值。(8)假定A是一个类,那么执行语句“A a,b(3),*p; ”调用了(B)次构造函数。 A.1 B.2 C.3 D.4 【结果分析】 声明指针是不会调用构造函数的。 (9)下面对析构函数的正确描述是(AC)。A.系统可以提供默认的析构函数 B.析构函数必须由用户定义 C.析构函数没有参数 D.析构函数可以设置默认参数 【结果分析】 析构函数的作用是在对象消失时执行一项清理任务。如果一个类中没有定义析构函数,系统将自动生成一个默认析构函数。析构函数没有参数,当然不可能设置默认参数。 (10)类的析构函数是(D)时被调用的。 A.类创建 B.创建对象 C.引用对象 D.释放对象 (11)创建一个类的对象时,系统自动调用(B); 撤销对象时,系统自动调用(C)。 A.成员函数 B.构造函数 C.析构函数 D.复制构造函数(12)通常拷贝构造函数的参数是(C)。 A.某个对象名 B.某个对象的成员名 C.某个对象的引用名 D.某个对象的指针名(13)关于this指针的说法正确的是(B)。 A.this指针必须显式说明B.当创建一个对象后,this指针就指向该对象 C.成员函数拥有this指针D.静态成员函数拥有this指针。【结果分析】 this指针是由C++编译器自动产生且较常用的一个隐含对象指针,它不能被显式声明。当创建一个对象时,this指针就初始化指向该对象。但只有非静态成员函数才拥有this指针,并通过该指针来处理对象。(14)下列关于子对象的描述中,(B)是错误的。A.子对象是类的一种数据成员,它是另一个类的对象 B.子对象可以是自身类的对象 C.对子对象的初始化要包含在该类的构造函数中 D.一个类中能含有多个子对象作其成员 【结果分析】 子对象不可以是自身类的对象。 (15)对new运算符的下列描述中,(B)是错误的。A.它可以动态创建对象和对象数组 B.用它创建对象数组时必须指定初始值 C.用它创建对象时要调用构造函数 D.用它创建的对象数组可以使用运算符delete来一次释放 【结果分析】 使用运算符new创建对象数组的格式如下: new <类型说明符> [<算术表达式>] 其中,<算术表达式>给出数组的大小,后面不能再跟构造函数参数,所以用它创建对象数组时不能指定初始值。 (16)对delete运算符的下列描述中,(D)是错误的。A.用它可以释放用new运算符创建的对象和对象数组 B.用它释放一个对象时,它作用于一个new所返回的指针 C.用它释放一个对象数组时,它作用的指针名前须加下标运算符[ ] D.用它可一次释放用new运算符创建的多个对象 【结果分析】 用delete一次只能释放用new创建的1个对象,但可释放一个对象数组。(17)关于静态数据成员,下面叙述不正确的是(C)。A.使用静态数据成员,实际上是为了消除全局变量 B.可以使用“对象名.静态成员”或者“类名∷静态成员”来访问静态数据成员 C.静态数据成员只能在静态成员函数中引用 D.所有对象的静态数据成员占用同一内存单元 【结果分析】 静态数据成员可以在静态成员函数中引用,也可以在非静态成员函数中引用。(18)对静态数据成员的不正确描述是(CD)。A.静态成员不属于对象,是类的共享成员 B.静态数据成员要在类外定义和初始化 C.调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针 D.只有静态成员函数可以操作静态数据成员 【结果分析】 this指针是一个局部量,局部于某个对象,而静态成员函数是属于整个类而不是某个对象,它没有this指针。静态成员函数和非静态成员函数均可操作静态数据成员。 (19)下面的选项中,静态成员函数不能直接访问的是(D)。A.静态数据成员 B.静态成员函数 C.类以外的函数和数据 D.非静态数据成员 【结果分析】 由于静态成员函数没有this指针,它只能直接访问该类的静态数据成员、静态成员函数和类以外的函数和数据,访问类中的非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问。 (20)在类的定义中,引入友元的原因是(A)。 A.提高效率 B.深化使用类的封装性 C.提高程序的可读性 D.提高数据的隐蔽性 【结果分析】 友元的作用主要是为了提高效率和方便编程,但友元破坏了类的封装性和隐蔽性,使用时要权衡利弊。 (21)友元类的声明方法是(A)。 A.friend class<类名>; B.youyuan class<类名>; C.class friend<类名>; D.friends class<类名>;(22)下面对友元的错误描述是(D)。A.关键字friend用于声明友元 B.一个类中的成员函数可以是另一个类的友元 C.友元函数访问对象的成员不受访问特性影响 D.友元函数通过this指针访问对象成员 【结果分析】 友元函数是一个放在类中的普通函数,它没有this指针。(23)下面选项中,(C)不是类的成员函数。 A.构造函数 B.析构函数 C.友元函数 D.拷贝构造函数 三、简答题 (1)类与对象有什么关系? 【问题解答】 类是一种用户自己定义的数据类型,和其他数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数。程序员可以使用这个新类型在程序中声明新的变量,具有类类型的变量称为对象。创建对象时,类被用做样板,对象称为类的实例。 (2)类定义的一般形式是什么?其成员有哪几种访问权限? 【问题解答】 定义类一般形式为: class类名{ public: <公有数据和函数> protected: <保护数据和函数> private: <私有数据和函数> }; 访问权限共有3种: 分别是公有(public)、保护(protected)和私有(private)。(3)类的实例化是指创建类的对象还是定义类? 【问题解答】 指创建类的对象。 (4)什么是this指针?它的主要作用是什么? 【问题解答】 this指针是C++语言为成员函数提供的一个隐含对象指针,它不能被显式声明。this指针是一个局部量,局部于某个对象。不同的对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象的数据成员。(5)什么叫做拷贝构造函数?拷贝构造函数何时被调用? 【问题解答】 拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象。为了保证所引用的对象不被修改,通常把引用参数声明为const参数。 在以下3种情况下,拷贝构造函数都会被自动调用: ◆当用类的一个对象去初始化该类的另一个对象时; ◆当函数的形参是类的对象,进行形参和实参结合时; ◆当函数的返回值是类的对象,函数执行完成返回调用者时。 四、程序分析题(写出程序的输出结果,并分析结果)(1) #include using namespace std; class Test { private: int num;public: Test();// 默认构造函数 Test(int n);// 带一个参数构造函数 }; Test∷Test() { cout<<“Init defa”< num=0;} Test∷Test(int n) { cout<<“Init”<<“ ”< num=n;} int main() { Test x[2];// 语句1 Test y(15);// 语句2 return 0;} 【输出结果】 Init defa Init defa Init 15 【问题分析】 本题主要考查构造函数的调用时机和构造函数的匹配问题。【要点提示】 构造函数在创建对象时被自动调用,具体调用哪个构造函数将由编译系统根据重载函数的匹配原则来确定。【结果分析】 ① 程序声明了2个对象x和y,类中有2个构造函数。 ② 程序首先执行语句1,创建对象x,调用默认构造函数。由于对象x是对象数组,每个数组元素被创建时都要调用构造函数,所以默认构造函数被调用了2次,输出第1、2行结果。程序接着执行语句2,创建对象y,调用带一个参数的构造函数,输出第3行结果。(2) #include using namespace std; class Xx { private: int num; public: Xx(int x){num=x;} // 构造函数 ~Xx(){cout<<“dst ”< }; int main() { Xx w(5);// 语句1 cout<<“Exit main”< return 0;} 【输出结果】 Exit main dst 5 【问题分析】 本题主要考查析构函数的调用时机。【要点提示】 析构函数在释放对象时被自动调用。【结果分析】 ① 程序声明了一个对象w。 ② 程序首先执行语句1,创建对象w,调用构造函数,num得到初值5。程序接着执行语句2,输出第1行结果。当程序结束时,释放对象w,析构函数被调用,输出第2行结果。 (3)将例3.10中的Whole类如下修改,其他部分不变,写出输出结果。 class Whole { public: Whole(int i);// Whole的有参构造函数 Whole(){};// Whole的无参构造函数 ~Whole();// Whole的析构函数 private: Part p1;// 子对象1 Part p2;// 子对象2 Part p3;// 子对象3 };Whole∷Whole(int i):p2(i),p1() { cout<<“Constructor of Whole”< Whole∷~Whole() { cout<<“Destructor of Whole”< 【输出结果】 Default constructor of Part Constructor of Part,3 Default constructor of Part Constructor of Whole Destructor of Whole Destructor of Part,0 Destructor of Part,3 Destructor of Part,0 【问题分析】 本题主要考查子对象初始化的方法和含有子对象时构造函数和析构函数的调用顺序。 【要点提示】 ◆当建立X类的对象时,先调用子对象的构造函数,初始化子对象,然后才执行X类的构造函数,初始化X类中的其他成员。 ◆对子对象构造函数的调用顺序取决于这些子对象在类中的说明顺序,与它们在成员初始化列表中给出的顺序无关。 ◆如果X类的构造函数没有给出成员初始化列表,表明子对象将使用默认构造函数进行初始化。◆析构函数的调用顺序与构造函数的调用顺序正好相反。【结果分析】 程序的Whole类中出现了类Part的3个对象p1、p2和p3,作为该类的数据成员,则p1、p2和p3被称为子对象。当建立Whole类的对象w时,子对象p1、p2和p3被建立,相应的构造函数被执行。由于p1在Whole类中先说明,所以先执行它所使用的构造函数,即类Part的默认构造函数,接着p2执行它所使用的有参构造函数,紧接着初始化p3,由于Whole类构造函数的成员初始化列表中没有子对象p3进行初始化的选项,所以执行类Part的默认构造函数,当所有子对象被构造完之后,对象w的构造函数才被执行,从而得到前4行输出结果,而后4行是执行相应析构函数的输出结果。(4) #include using namespace std; class Book { public: Book(int w); static int sumnum; private: int num;}; Book∷Book(int w) { num=w; sumnum-=w;} int Book∷sumnum=120;// 语句1 int main() { Book b1(20);// 语句2 Book b2(70);// 语句3 cout< return 0;} 【输出结果】 【问题分析】 本题主要考查“在类的范围内所有对象共享静态成员的数据”的含义。【结果分析】 程序中语句1对静态成员sumnum进行初始化,sumnum得到初值120。执行语句2时,调用构造函数,sumnum变为100。接着语句3,再调用构造函数,sumnum变为30。 五、程序设计题 (1)声明一个Circle类,有数据成员radius(半径)、成员函数area(),计算圆的面积,构造一个Circle的对象进行测试。【问题分析】 本题主要考查类定义的形式、对象成员访问和对象初始化的方法。要求理解类和构造函数的真正含义,特别注意如何将客观事物的属性和行为抽象为类的成员。【解题思路】 ① 题目中已给出了类的基本部分,需要增加一个构造函数来初始化数据成员radius。 ② 为了程序的通用性,圆的半径由键盘输入。【参考程序】 // xt3_1.cpp #include Javaweb复习题 1.什么是超文本协议?一般JSP应用程序服务器(WEB服务器)使用的发布端口是多少? 超文本协议(HTTP)Hypertext Transfer Protocol:进行超文本和超媒体数据的传输.发布端口为8080 2.Eclipse一般通过什么来进行功能的扩展。插件 3.JSP有哪三种脚本元素 JSP中的脚本元素主要包括三个主要部分:--脚本段:<%This is a scriptlet%>--声明:<%!This is a declaration%>--表达式:<%=This is a expression%> 4.JSP的内置对象有哪九个? 以上的9个内置对象中比较常用的是pageContext、request、response、session、application这5个。(有关内置对象的使用详细看一下课本或PPT)5.WEB-INF文件夹下进行SERVLET配置的文件是什么?web.xml 6.JSP中 request对象采用什么方法获取表单提交信息? 单一的参数都可以使用getParameter()接收,而一组参数(同名参数)要用getParameterValues()接收。 在表单控件中,像文本框(text)、单选按钮(radio)、密码框(password)、隐藏域(hidden)等,一般都会使用getParameter()方法进行接收,因为这些控件在使用时参数的名称都只有一个不会重复;而像复选框(checked),一般参数的名称都是重复的,是一组参数,所以只能使用getParameterValues()方法接收,如果不小心使用了getParameter()方法,则只会接收第一个选中的内容。 7.客户端向服务端提交数据的方法有哪两种? get请求、post请求 8.服务器默认的编码为什么?常见的中文编码为什么? 服务器默认的编码:ISO8859-1 常见的中文编码:GBK <%@ page contentType=“text/html;charset=GBK”%> <% request.setCharacterEncoding(“GBK”);// 按中文接收 String str = request.getParameter(“info”);// 接收表单参数 %> 参数内容:<%=str%> JSP通过JDBC(Java DataBase Connectivity、Java数据库连接技术的简称)技术操作数据库 查询结果集类ResultSet 10.SERVLET本身是个JAVA类,必须放置在那个文件夹下? Servlet本身就是个Java类,所以必须放在WEB-INF/classes子文件夹下 11.HTML语言中的各种常用标签有哪些? 、第五篇:Javaweb复习题(带答案)