第一篇:面向对象分析和设计
面向对象分析与设计课程总结
面向对象分析与设计
课程总结
0923010208 指导老师:庄育飞
这学期学院开设了面向对象分析与设计(UML)这门课,通过老师的讲解,自己一些相关书籍的阅读和实践作业的完成,逐步对课程有了由浅及深的认识。我觉得学习这门课还是受益匪浅的。
面向对象(Object Oriented,OO)是一门以实践为主课程,课程中可以分开两块OOA(面向对象系统分析)和OOD(面向对象系统设计)。
OOA(面向对象系统分析)主要内容: 研究问题域和用户需求,运用面向对象的观点和原则发现问题域中与系统责任有关的对象,以及对象的特征和相互关系.OOA不涉及针对具体实现采取的设计决策和有关细节,独立于具体实现的系统模型。是一个完整确切反映问题域和用户需求的系统模型。OOA的优势:复
用、可扩展、可维护性、弹性。
OOD(面向对象系统设计):以OOA模型为基础,按照实现的要求进行设计决策,包括全局性的决策和局部细节的设计,与具体的实现条件相关。OOD的步骤:细化重组类→细化和实现类之间的关系,明确其可见性→增加属性,指定属性的类型和可见性→分配职责,定义执行每个职责的方法→对消息驱动的系统,明确消息传递的方式→利用设计模式进行局部设计→画出详细的类图和时序图。
面向对象的分析与设计方法将致力于解决传统软件研发过程中由于软件模块化结构化程度不高带来的软件重用性差、软件可维护性差、开发出的软件不能满足用户需要等方面问题。面向对象的概念包括:对象、对象的状态和行为、类、类的结构、消息和方法。对象概念将包含对象唯一性、抽象性、继承性、多态性的重要特征。面向对象的要素包含:抽象、封装性、共享性三方面。
在设计模式的研究过程中,我们组选择的是迭代器(Iterator)的设计模式研究。完成设计研究后,我对迭代器的设计模式有了更为深刻的理解。迭代器(Iterator)提供一个方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示。并了解到迭代器设计模式一般在以下三类场合使用较多。
访问一个聚合对象的内容而无需暴露它的内部表示。
支持对聚合对象的多种遍历。因为遍历状态是保存在每一个迭代器对象中的。
为遍历不同的聚合结构提供一个统一的接口。根据实现方式的不同,效果上会有差别。同时还简化了容器的接口。但是在java Collection中为了提高可扩展性,容器还是提供了遍历的接口。
在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。
在Java Collection的应用中,提供的具体迭代器角色是定义在容器角色中的内部类。这样便保护了容器的封装。但是同时容器也提供了遍历算法接口,你可以扩展自己的迭代器。至于迭代器模式的使用。客户程序要先得到具体容器角色,然后再通过具体容器角色得到具体迭代器角色。这样便可以使用具体迭代器角色来遍历容器了。
OOA和OOD之间没有明显的界限。OOA与OOD的不可分割性正好说明了OO思想的强大,即软件过程阶段的无缝连接,在交流与沟通中不会产生鸿沟,这是相对结构化思想的好处,因为从功能模块到某块详细控制逻辑设计两者之间的联系不是十分紧密,需要分析人员与设计人员的再沟通。
通过课程的学习与实践,对面向对象的理念,以及相关方法,设计模式有了更为深刻的理解与掌握。针对面向对象的分析与设计课程的授课内容及方法,我个人觉得对我还是有不少的帮助和 提高。结合自己的工作,
虽然与开发接触的比较少,但是在运维过程中,如果能了解开发原理,结合实际的工作,会对一些源代码的分析能力以及工作效率的提高起到明显的帮助作用。
庄老师上课经常说一些与课程无关的内容,我已开始并不理解他的作法,后来我慢慢认识到面向对象分析设计的学习就是培养思想的一种过程,这种思维方式还是需要大量的实践才能灵活的运用。目前的阶段,只能说是知道有这样一种设计思想、这种解决问题的方案,至于在何时应该使用、如何去使用,就需要在今后的经验中去累积了。
下面是一些我掌握的基础知识
9种UML图:
类 图:描述类的结构(包括属性以及类之间的相互关系)
对象图:对象以及对象之间的相互关系
构件图:构件及其相互依赖关系
部署图:构件在各节点上的部署
顺(时)序图:强调时间顺序的交互图,用于将系统行为分配给类。一般包含了边界、控制、实体对象
协作图:强调对象协作的交互图,与时序图同构
状态图:类所经历的各种状态,包括状态之间的转换以及触发转变的事件
活动图:对工作流程建模
用例图:与用例文档结合进行需求捕获,测试依据
面向对象设计七个原则:
开-闭 原则、里氏转换原则、依赖倒转原则、接口隔离原则、组合/聚合复用原则、迪米特法则、单一职责
ICONIX开发过程:域模型——用例文档——健壮性分析——健壮图——时序图
设计模式:
1)创建模式: 涉及对象的创建
单例模式, 工厂模式, 建造者模式,原型模式
2)结构模式:涉及类和对象的组合
Facede外观模式, 代理模式, 适配器模式, 装饰模式
3)行为模式: 刻画了类和对象交换及分配职责的方式.主要目标是解耦
观察者模式, 命令模式, 模板模式
本学期学了《面向对象系统分析与设计》课程,本课程我们主要是学习了面向对象的统一建模语言UML,了解面向对象技术的基本概念,掌握面向对象的分析和设计方法,以及与面向对象技术相关的一些软件开发技术,同时掌握在IBM RSA软件环境下用UML进行分析和设计的技术。在《面向对象系统分析与设计》
的上级课程上,我们的实践能力方面着重设计构思和设计技能的得到基本训练,熟练的上机操作能力和分析能力,加深理解、验证、巩固课堂教学内容。
数据库是以信息处理为核心的任何应用系统的基础,数据库设计的质量直接关系到系统开发的成败和优劣。数据库设计的方法与系统使用的开发方法有着密切的关系,同时还与所应用的数据库模型(层次模型、网状模型、关系模型、对象模型)有关。目前经常采用E—R(Entity—Relationship)图的方法设计数据库。但E—R图设计数据库存在的主要问题是只能对资料建模,而不能对行为建模。而UML类图的描述能力更强,UML类图是E—R图的扩充。对于关系模型来说,可以用类图描述数据库模式,用类描述数据库表。
UML是应用面向对象方法进行系统开发的全程建模语言,可用于业务分析、需求分析、系统设计、系统实现与测试等系统开发的各个环节。 UML概念设计的基本工作分为两个方面:
· 一是从系统分析和系统设计所建立的各种类图中抽取持久型类。
· 二是确定持久型类之间的关系,并用类图描述这种关系,从而把类图作为数据
库概念设计的结果。
1.抽取持久型类
持久型类是指类的完整信息需要在数据库中存储的类。在UML中,类可以分为
边界类、实体类和控制类三种类型。
· 接口类和控制类的信息一般不需要长久存储。
· 持久型类只可能是实体类,但并不是所有实体类的信息都需要长久地存储,持久型类只需要从那些信息需要长久存储的实体类中抽取。
2.确定类关系
在比较复杂的系统分析和设计中,并没有建立立足于整个系统的整体类图,而只是建立了一个个针对具体用例的类图。也就是说,所提取的持久型类被分散到各个用例类图当中了。因此,需要对抽取的持久型类进行分析,以确定它们之间的相互关系,建立起反映这些类关系的类图。
UML数据建模与E—R图有着本质的区别。在E—R图中,应用型数据库系统的重点是数据库结构。概念设计是应用型数据库系统开发的重点和难点。而UML是用于面向对象系统开发的全程建模语言,可用于需求分析、系统分析与设计、系统实现、系统测试等系统开发的所有环节。由于UML基于面向对象技术,而要保持方法的一致性,最好选择面向对象数据库。但是,目前的面向对象数据库在实现技术上还不十分成熟,即使应用面向对象技术和环境开发应用系统,通常的做法是使用UML进行建模,用关系型数据库储存和管理数据。
通过一学期的学习和实践,我了解到uml具有以下特点[1]:
(1)面向对象。uml支持面向对象技术的主要概念,提供了一批基本的模型元素的表示图形和方法,能简洁明了地表达面向对象的各种概念。
(2)可视化,表示能力强。通过uml的模型图能清晰地表示系统的逻辑模型和实现模型。可用于各种复杂系统的建模。
(3)独立于过程。uml是系统建模语言,独立于开发过程。
(4)独立于程序设计语言。用uml建立的软件系统模型可以用Java、vc++、smalltaik等任何一种面向对象的程序设计来实现。
(5)易于掌握使用。uml图形结构清晰,建模简洁明了,容易掌握使用。 使用uml进行系统分析和设计,可以加速开发进程,提高代码质量,支持动态
的业务需求。uml适用于各种规模的系统开发。能促进软件复用,方便地集成已有的系统,并能有效处理开发中的各种风险。
而且uml是一种功能强大的、面向对象的可视化系统分析的建模语言,它采用一整套成熟的建模技术,广泛地适用于各个应用领域。它的各个模型可以帮助开发人员更好地理解业务流程,建立更可靠、更完善的系统模型。从而使用户和开发人员对问题的描述达到相同的理解,以减少语义差异,保障分析的正确性。
通过对学籍管理系统的开发可以看到,uml作为软件工程中的建模语言,代表了面向对象方法的软件开发技术的发展方向,具有重大的经济价值和国防价值,并获得了国际上的广泛支持,具有非常好的应用前景。
由于明年需要参加考研,复习很紧张,所以这学期面向对象分析与设计这门课程我并没有深入地去学习,但这无法影响我对UML的喜爱,老师上课很生动,不光在学习上教导我,在生活和做人理念上也对我有所帮助。这篇学习总结写得比较乱,但我都有用心,在以后的学习过程中我会继续努力,再次多谢庄老师的教诲。
第二篇:UML与面向对象分析与设计
实验实践训练体系
适用专业: 计算机科学技术、软件工程
第一部分 课程与实验综述
一.课程简介及实践要求:
《UML与面向对象分析与设计》是以介绍面向对象的统一建模语言UML为主,使学生了解面向对象技术的基本概念,掌握面向对象的分析和设计方法,以及与面向对象技术相关的一些软件开发技术,同时掌握在Rational Rose环境下用UML进行分析和设计的技术。本课程在教学内容方面着重基本理论、基本知识和基本方法,在培养实践能力方面着重设计构思和设计技能的基本训练,熟练的上机操作能力和分析能力。
实验实践训练是UML与面向对象分析与设计教学的重要技能环节。通过实验,使学生加深理解、验证、巩固课堂教学内容,特别是通过设计和综合实验,发挥学生的想象力和创新能力。
二.课程实验目的要求:
通过UML的实验,学生应该: 1.学会用面向对象的思想去分析和设计相关系统; 2.学会用Rose建模工具进行软件建模。 三.课程实验参考资料
1.(美)Joseph Schmuller著.UML基础、案例与应用.人民邮电出版社,2004 2.(美)Hans-Erik Eriksson.UML 2工具箱. 电子工业出版社,2004 3.吴际,金茂忠.UML面向对象分析.北京航空航天大学出版社,2002 4.赵从军.UML设计及应用.机械工业出版社,2004 5.Grady Booch,James Rumbaugh,Ivar Jacobson.UML用户指南.机械工业出版社,2001 6.吴建,郑潮,汪杰.UML基础与Rose建模案例.人民邮电出版社,2004 第二部分 实验实践指导
实验一
用例图
一、实验目的
1.学会分析系统中的参与者和用例 2.掌握用例图的绘制方法
二、实验器材
1. 计算机一台;
2. Rational Rose 工具软件;
三、实验内容
画出ATM系统的用例图
四、实验步骤
1.分析
ATM自动取款机:客户可以取钱,存钱,查询余额,转帐,修改密码。 通过分析可找出如下几个参与者: 1.ATM 2.客户
通过分析得到如下用例:
(1)存款 (2)取款 (3)查询余额 (4)转帐 (5)修改密码 (6)打印收据 2.绘图步骤:
下面介绍在Rose2003中创建用例图的过程:
(1)在“Use Case View“中双击Main图,或者右击“Use Case View“,弹出在快捷菜单中选择“New”->“UseCase Diagram”,双击图标,出现图1,为编辑用例图做好准备。
(2)在用例视图中,从工具栏中选择Actor图标,在右边的绘图区中添加一个新元素,并取名客户表明新增一个参与者,如图2所示。
图2 (3)同样的方法添加参与者“ATM”,如图3所示。
图3 (4)在工具栏上选择用例的图标,依次添加存款、取款、查询余额、转帐、修改密码、打印收据,如图4所示。
图4 (5)添加参与者和用例间的关联关系,如图5所示。
图5
五、实验报告要求
1. 整理实验结果。 2. 小结实验心得体会。
实验二
交互图
一、实验目的
1.学会用协作图实现用例
2.掌握顺序图的绘制方法以及顺序图和协作图的相互转换。
二、实验器材
1. 计算机一台;
2. Rational Rose 工具软件;
三、实验内容
画出ATM取款的顺序图,并转换为协作图。
四、实验步骤
1.分析
ATM取款的场景:
(1)通过读卡机,用户插入ATM卡;
(2)ATM系统从卡上读取银行ID、帐号、加密密码、并用主银行系统验证银行ID和帐号;
(3)用户输入密码,ATM系统根据上面读出的卡上加密密码,对密码进行验证; (4)用户输入取款数量;
(5)ATM系统通知主银行系统,传递储户帐号和取款数量,并接收返回的确认信息; (6)ATM系统输出先进、ATM卡和显示帐户余额的收据; (7)ATM系统记录事务到日志文件。 寻找场景中的对象:ATM、客户和帐户。 2.绘图步骤:
下面介绍在Rose2003中创建顺序图的过程:
(1)在“Logical View”中新建“Sequence Diagram“,双击图标,出现图1,为编辑顺序图做好准备。
(2)在顺序图编辑窗口中,从工具栏中选择Object图标,在右边的绘图区中添加一个新元素,并取名Customer表明新增一个对象,如图2所示。
图2
(3)同样的方法,添加ATM对象和Account对象,如图3所示。
图3 (4)根据ATM取款的场景,获得第一条消息为“客户向ATM机提交取款需求”,向图中添加消息,如图4所示。
图4
(5)同样的方法添加其它消息,如图5所示。
图5 (6)根据顺序图生成协作图, 步骤如下:“Browse”->“Create Collaboration Diagram”,生成的协作图,如图6所示。
图6
五、实验报告要求
1. 整理实验结果。 2. 小结实验心得体会。
实验三 类图
一、实验目的
1.理解类的基本概念 2.理解类间的关系 3.掌握类图的绘制方法
二、实验器材
1. 计算机一台;
2. Rational Rose 工具软件;
三、实验内容
分析选课系统中的类及关系,然后画出它们的类图。
四、实验步骤
1.分析
在选课系统中,通过分析可抽象出如下几个类: 1.学生类 2.管理员类 3.课程类
学生类和管理员类的属性较容易分析,这里只列出课程类的属性和方法: (1)课程名称 (2)开课教室 (3)课程号 (4)授课教师 (5)选课的学生 (6)开课起始时间 (7)允许选课的学生人数 (8)设置课程号 (9)设置课程名称 (10)查询课程号
(11)查询允许选课的学生人数 2.绘图步骤:
下面介绍在Rose2003中创建类和它们之间关系的过程:
(1)在“Logical View“中双击Main图,或者右击“Logical View“,弹出在快捷菜单中选择“New”->“Class Diagram”,双击图标,出现图1,为编辑类图做好准备。
图1
(2)在逻辑视图中,从工具栏中选择class图标,在右边的绘图区中添加一个新元素,并取名Student表明新增一个类。
图2
(3)选择新创建的元素,点击鼠标右键,在弹出的菜单中选择“Open Sepcification”,弹出图3对话框。
(4)在对话框中,可以修改元素的名称,这里新元素的名称定为“Student”,如图4所示。
图3
图4 (5)点击“Attributes”选项卡,添加属性,如图5所示。
图5 (6)点击“operations”选项卡,添加方法如图6所示。
图6 (7)同样的方法添加Course类,如图7所示。
图7 (8)创建两个类之间的关系,通过分析得出:学生类和课程类之间为单向关联。 选择图标栏的“关联”,由学生类指向课程类。如图8所示。
图8 (9)创建关联名。右击关联,选择“open specification“,键入关联名,如图9所示。
图9 (10)分别在“Role A Detail“和“Role B Detail“选项卡中键入名称和多重性,如图10所示。
图10 (11)重复(2)-(10)中的步骤完成选课系统整个类图的创建。
五、实验报告要求
1. 整理实验结果。 2. 小结实验心得体会。 实验四 状态图和活动图
一、实验目的
1. 熟悉状态图和活动图的基本功能和使用方法。 2. 掌握如何使用建模工具绘制状态图和活动图方法。
二、实验器材
1. 计算机一台;
2. Rational Rose 工具软件;
三、实验内容
(1)分析图书管理系统中的书和借书证的状态,画出它们的状态图; (2)分析管理员的活动状态,画出管理员的活动图。。
四、实验步骤
1.分析
在图书管理系统中,分析书的状态如下: 1.可借 2.被借 3.被预约 4.删除
借书证的状态如下: 1.可用 2.不可用 3.删除
管理员的活动如下: 1. 处理还书 2. 处理借书 3. 处理罚款 读者的活动如下: 1.登录 2.找书 3.预约 4.浏览 2.绘图步骤:
下面介绍在Rose2003中创建类和它们之间关系的过程:
(1)在“Logical View“中信件“StateChart Diagram”,双击图标,出现图1,为编辑状态图做好准备。
图1 (2)在工具栏中选择“Start State”图标添加到编辑窗口中,如图2所示。
图2 (3)在工具栏中选择“State”图标,添加一个元素,命名为“New book”,如图3所示。
图3
(4)同样的方法添加其它状态,如图4所示。
图4
(5)书的各个状态之间添加转移及相应的事件,如图5所示。
图5
(6)同样的方法得借书证的状态图,如图6所示。
图6
(7)在Rose2003中,绘制图书管理员的活动图,新建“Activity Diagram”,如图7所示:
图7
(8)读者的活动图如图8所示:
图8
五、实验报告要求
1. 整理实验结果。 2. 小结实验心得体会。
第三篇:面向对象的设计与分析(网上商城的建模设计)
第4章江西师范大学“网上商城”建模实例
本文所要进行建模分析的系统是学校小型电子商务系统,以欲构建的江西师范大学的便利店和生活超市“网上商城”为例,是满足校园客户(主要在校学生)网购要求的综合性的应用系统,本文以Rational rose 2003为建模工具,并应用第三章提出的基于UML的电子商务系统建模过程,完成该系统的详细分析和设计。对系统进行需求分析,建立系统需求模型、静态结构视图、动态结构视图、数据库模型、物理模型。
4.1系统的需求分析 4.1.1系统的设计背景
江西师范大学瑶湖校区江西师范大学新校区,地处南昌市昌东镇,在校学生3万余人,由于学校占地面积很大,离市区比较远,周围设施还不是很齐全,该校区为解决师生日常生活需要,建设了商业街并且每个宿舍区都有便利超市,这些店是一个小型的生活用品采购区,在校学生平时的大部分消费都是在这些地方,包便利店和小型超市等生活服务的实体商店,满足了师生不出校门就能买到自己想要的东西。近些年,随着高校的扩招,该校区学生和老师的数量也不断增加,新的问题也随之而来,高校学生由于社会发展带来的的巨大压力,生活节奏也日益加快,空闲时间也越来越少。所以如果他们每次生活消费都要到实体店购买,就给他们的生活带来不便,因而如果能够网上购物就解决了这个矛盾。另外,据数据显示,该校学生80%是网民,该群体的素质较高,接受新事物速度快,而且他们的消费兴趣和倾向也有高度的相似性。该校区学生居住地也比较集中,大都住在学校统一安排的公寓或者学校周围的小区,使物流配送更加方便和及时。 目前学校的实体商店很多,但是大多数商店还没有自己的电子商务系统,所以如果通过一个统一的网上购物平台,商店将这些商品都发布在网上商城上,师生就可以足不出户选购商品,非常方便。只要授予他们可以在平台上销售自己的商品,提高了商店的知名度,也提高了他们的服务能力和影响力。该网上商城具有一般网上购物系统的功能: 1.师生可以通过该网上商城注册为商城用户,浏览商品订购商品放入购物车;客户可以通过该商城发布评论信息;客户可以查看自己订单;客户可以支付商品货款。
2.商户可以通过该商城发布自己的商品信息、供师生购买;可以通过该商城管理自己的商品信息和员工信息;可以进行订单处理。 3.系统管理员对商户申请信息进行审核;对评论信息管理:对系统日常的维护和数据备份;对用户信息管理。
除了以上三个一般购物系统的功能商城的系统管理员可以通过对历史订单信息进行数据挖掘,找出顾客购买商品间的关联关系,建议商户对其营销策略进行调整或者绑定销售一些商品,以提高商户的销售利润,达到在线交易和实体店双重赢利。该功能模块的设计将在第五章详细说明。 4.1.2系统的模块设计
根据以上背景,本文欲构建一个具有上述功能的江西师范大学“网上商城”。该商城可以满足师生网上购物的要求,注册该商城用户都可以直接登录到该商城。该商城为校园的客户提供了一个统一的网上交易平台,该网上商城的业务流程图,如图4.1所示。
通过以上背景分析和业务流程的设计,根据一般网上购物系统的功能,并结合该“网上商城”的特殊功能需求,根据商城所涉及到的主要参与者将该商城主要功能描述如下: 1,商城维护:管理员可以对商城日常维护和数据备份。 2.商户信息管理:管理员对申请加盟的商户等级管理和商户信息修改,添加等操作。
3.商城用户信息管理:对商城注册用户信息的管理,以及其应用权限
4.评论管理:管理员可以对评论信息进行处理,对于不符合要求的评论可以删除。
5.收集数据:系统管理员可以根据数据库中一段时间的订单历史记录查询分析,收集到分析数据。
6.订单分析:管理员可以对收集到的数据进行分析,得出商品之间的关联性。建议商户调整销售策略,从而提高商店利润。
7.商城注册:非家园网或非商城用户的客户可以注册为商城用户。 8.修改个人资料:注册用户可以修改自己的注册资料。包括地址,电话等基本信息。
9.商城登录:系统管理员、用户、商户都可以登录商城相应的模块在相应权限内操作。
IO.查看商品信息:进入商城的师生都可以浏览商品信息,该商品信息包括商品的基本信息和商品的库存。
11.购物:如果商品有库存则客户可以购买,如果缺货则不能购买,客户将商品放入购物车,进行购物。客户可以对购物车里的商品随时修改,删除,添加和清空。
12.下订单:客户将商品加入购物车后,可以填写订单,对于订单,在未处理之前,客户也可以随时登录系统修改并提交。
13.支付:订单提交以后,客户可选择支付方式,如选择货到付款则订单完成,如选择网上支付,则客户要登录网上银行支付,支付完成则该订单完成。
14.订单查看:客户可以随时登录系统查看自己的历史订单信息,可以删除历史订单,可以查看订单状态,订单在未处理之前都可以修改然后再提交,也可以对取消未处理的订单。
15.评论:收到商品以后客户对商品和商户的服务是否满意可以对此订单进行评论。
16.申请加盟商城:商户申请加盟商城,资格审核通过后可以在商城建立自己的网上商店,拥有该商店的管理权限,可以进行网上交易。 17.商品信息维护:商户可以随时添加、修改、删除商品的信息。 18.配送员信息管理:商户可以对商店里的配送员信息进行添加、修改、删除,以更好的管理商店的配送工作。
19.订单处理:客户提交订单以后,商户接收订单并与客户确认订单以后对订单进行处理,根据订单所购买的商品,商户查询库存,确认库存中有该商品,对订单进行审批,审批完了后则打印配送订单,安排送货。
20.派遣配送员:商户点击相关功能,将输出配送员编号,商户把送货单和商品交予该配送员负责,配送员把商品送到客户指定的地点,如果无人收货,则在订单回执中填写“无人接货”,如果收货成功,则填写“收货成功”,如收货人推迟收货则填写“推迟收货”。并将订单回执交予商户。
21.库存管理:商户可以对商品库存进行定期清点,并修改商品信息中的库存信息。
22.配送订单管理:对已经处理的订单,商户打印出配送订单,并安排配送员配送,对配送订单的完成情况进行管理。
23.查看商品销售记录:商户可以对本商店的商品信息随时查看。 24.查询分析结果:商户可以登录商城查询商品的关联分析结果,通过结果设置相应的销售捆绑包或交叉销售。
25.设置销售捆绑包:对分析到的关联商品,通过后台输入设置到捆绑包中。
满足上述需求的系统主要包括以下几个模块: 系统管理模块:该模块是系统提供给系统管理员的接口模块。主要包括对校园商户的加盟审核,对商店申请信息的管理,根据商户等级和信誉来决定删除和添加商户,另外对网站用户信息的管理。该模块可以对系统日常维护和数据备份,并且通过对订单信息进行数据分析,以帮助商户制定营销策略,赢得更大的利润。
用户接口模块:该模块为想购买该网站商品的学生提供的了入口,所有校园的师生都可以通过浏览器浏览该网站商品,可以注册为该系统用户并登录该系统订购自己喜爱的商品。
商户操作模块:该模块是“网上商城”的核心模块。主要包括接受客户完成的订单需求,指派特定的配送员,配送员根据订单所需提货,配送员送货上门,客户签收商品并生成回执单,商户可以查看最近一段时间某商品的销售记录,根据查看的商品订单分析结果制定相应的捆绑销售或者交叉销售策略。
4.2需求建模
该系统需求建模描述系统用户使用一个系统的方式,描述系统应该具备什么功能,是系统用户或者另一个系统与系统之间的一次交互过程,是系统分析和设一计的第一步,以系统全局的功能作为参考,把系统所涉及的参与者和他们从外部观察到的系统的功能描述出来,而并不描述这些功能在系统功能的实现形式。这个过程使用UML建立系统的用例图,分离出系统执行者和用例,以及用例之间的关系。 4.2.1系统参与者
参与者是系统外部的一个实体,可以是系统用户、与所建造的系统交互的其他系统或者是一些可以运行的进程。第一,在每一个系统中,几乎都存在着最常用的参与者一真实的人(用户);第二,需要建立联系的其他外部应用程序,即其他系统;第三,一些可运行的进程,如时一间;通过上面对该系统的功能分析和系统功能模块的设计,系统参与者主要有:系统管理员、客户、商户和支付系统。 4.2.2识别用例
确定用例最常用的方法是从分析系统参与者开始,把每个系统参与者如何使用系统的行为都考虑进来。根据上一节系统的需求分析功能模块,可以确定系统参与者有系统管理员、客户、商户和支付系统。根据上一小节的功能模块分析,得出系统的顶层用例图,如图4.2 0
下面分别对三个用例细化,系统管理所涉及到的用例有:商城登录,商户信息管理,用户信自、管理,评论管理,商城日常维护和订单分析。涉及到的参与者是系统管理员,系统管理的用例图如4.3所示。
用户接口用例细化有:商城注册,商城登录,查看商品信息,修改个人资料,购物,下订单,支付,评论,订单查看。用户接口的用例图如图4.4所示。
其中“购物”用例细化的用例有:清空购物车,修改购物车商品,添加商品到购物车,查看购物车信息,删除购物车中的商品。细化后的用例图如图4.5
“订单查看”用例细化的用例有:修改订单,提交订单.,删除订单,查看历史订单,订单状态查询,取消订单。细化后用例图如图4.6所示。
商户操作的细化用例有:申请加盟商城,商城登录,商品信息维护,配送信息管理,订单处理,配送订单管理,派遣配送员,查看商品销售记录,库存管理,查看订单分析结果,设置商品销售捆绑包。商户操作用例细化图,如图4.7所示。
商品信息维护的细化的用例有:增加商品信息,删除商品信息,修改商品信息。细化后的用例图如图4.8所示。
订单处理的细化用例有:确认订单,接收发货,查询商品库存。如图4.9
支付系统用例有:支付,网上支付,货到支付。支付系统的用例图,如图4.10所示。
根据以上对系统参与者的用例图分析与建模,得出系统的完整的用例图,如图4.11所示。
4.3静态结构建模
静态结构模型是对有关系统实现内部和应用领域的概念进行建模,本文通过分析上述需求建模中的用例和问题域,抽取相关的类,并将这些类之间的关系表示出来,以及类的内部结构,最后完成类图,反应了系统的一种静态关系。 (1)抽取系统中的类
系统中存在三种类,一种是系统与外界的交界处,包括各种窗体和接口(与报表、打印机和扫描仪等硬件的接口或者与其他系统的接口);另一种是负责协调其他类工作的控制类,是控制使用事件的顺序的类;第三种是保存放入永久存储体的数据信息类,即实体类。本文将以“下订单”举例说明分析类的整个流程。
下订单用例的主要功能是:客户登录商品信息查看页面,系统验证客户注册信息,系统打开下订单页面,填写订单并提交订单信息,根据以上描述,该用例涉及到的类如下: 边界类:商品信息查看页面,填写订单页面。
控制类:下订单。
实体类:客户信息类,商品详细信息类,订单信息类。
据以上方法分析系统其它用例并经过整理合并,得出网上商城的类如下: 1.边界类:用户注册界面,用户登录界面,商品详细信息界面,商品查看界面,下订单界面,评论界面,支付界面,个人资料修改界面,订单查看界面,商品信息维护界面,查看订单分析结果界面,派遣配送员界面,设置商品销售捆绑包界面,订单处理界面,配送订单管理界面,配送员信息管理界面,库存管理界面,查看商品销售记录界面,商户信息管理界面,用户信息管理界面,商城维护界面,审核界面,评论管理界面,收集数据界面,订单分析界面。
2.控制类:用户注册,用户登录,浏览商品,下订单,评论,支付,个人资料修改,订单查看,商品管理,配送员管理,查看订单分析结果,派遣配送员,设置商品销售捆绑包,订单处理,配送订单管理,库存管理,查看商品销售记录,用户管理,商户管理,商城维护审核,评论管理,收集数据,订单分析。
3.实体类:用户信息类,商品信息,订单信息,配送员信息类,购物车信息类,配送订单信息类,商户信息类,商品销售记录信息类,评论信息类。管理员和客户都属于系统的非商业用户,所以将它们统称为用户信息类。电子商务配送系统在Internet中使用,所以为了安全起见,在分析实体类中,将经常使用的类所涉及操作和基本信息分别设计一个类。例如,客户信息类,客户涉及到的信息设计到客户信息类中,而客户所涉及到的方法操作则归为客户信息操作类。这样体现了而向对象的封装性和安全性,能更好的满足系统运作要求。
(2)生成类图
通过上述类的分析,要生成类图还需要弄清楚类与类之间的关系,并且要确定类的属性和方法。上文分析了与“下订单”用例相关的类,下面接着讨论类的属性和方法,并生成相关类图。
边界类:商品详细信息界面(GoodsDetailslnterface )填写订单页面(OrdersInterface ),主要是打开新的界面。
控制类:下订单C Order )。协作类之间的工作,起到“中介”的作用。
实体类:用户信息类(ClientInformations ),商品信息类(GoodsInformations)订单信息类(OrderInformations),用户信息操作类(ClientOP ),商品信息操作类(GoodsOP),订单信息操作类(OrderOP ) 。ClientInfornlations类的重要属性有:用户ID号,用户名,注册日期,登录密码,电子邮件;ClientOP类的主要操作有:系统注册,系统登录,查看商品,订购商品,支付;GoodsInformations类主要属性有:商品ID号,商品名称,商品描述,商品价格,商品库存,商品类别;GoodsOP类的主要操作有:获取商品ID号、商品名称和价格;OrderInformations类主要属性有:订单ID号,商品ID号,商户ID号,用户ID号,客户姓名,订购日期,订购者地址,商品数量,商品价格;OrderOP类涉及的操作有:搜索订单,查看订单,处理订单,添加订单,删除订单。
根据以上分析,下订单的类图如图4.12。实线箭头表示的是关联关系,虚线箭头表示的是依赖关系。
由于电子商务配送系统涉及到类图比较庞大,而分析类图的过程可以通过上述方法一一得出用例的类图,本文只对系统中的实体类图进行建模。运用上文方法分析实体类所涉及到的信息类,实体类图4.13a
4.4动态结构建模
用例图和类图描述了系统的静态结构,接下来建立系统的动态行为模型,动态行为模型主要是建立系统的顺序图和活动图,川页序图主要来表示对一象之间的关系和对象之间传送消息的时间顺序。活动图则是描述活动的顺序的一种流程图,是从一个活动到另一个活动的控制流。
(1)顺序图
该商城系统涉及到的顺序图有很多,比如用户登录顺序图,下订单顺序图,删除订单顺序图,增加订单顺序图,订单处理顺序图。本文将通过“系统登录”顺序图和“下订单”顺序图建模为例来说明系统动态结构建模。
“商城登录”用例涉及到参与者是用户,包括管理员和其他用户,这里以客户登录系统为例,涉及到的对象有“登录界面”,“服务器”和“数据中心”,根据ROSE中的顺序图的建模方法,本文得到“商城登录”用例的顺序图如图4.14。
根据上文分析的“下订单”用例类图,“下订单”用例的顺序图参与者是客户,所涉及到的对象有“登录界面(login)”“商品信息查看界面(GoodsDetailsInterface ) "“下订单界面(OrdersInterface“
“订单信息操作(OrderOP)”,用ROSE建模得出的“下订单”顺序图如图4.15所示。
(2)活动图
活动图表示一个事件正在运行的状态,事件是系统中某个对象的一个操作,主要表现一个活动到另一个活动控制流,是系统内部的驱动流程。一个系统涉及到的活动图很多,本文提到的系统活动图有:客户下订单的活动图,商城用户登录活动图,派遣配送员的活动图等,本文将以“下订单”活动图为例。 根据活动图的组成元素,“下订单”包括很多活动状态,比如:查看商品,提交订单,订单处理等一系列状态,“下订单”就是从一个活动状态转换为另一个活动状态,直至完成该动作,活动图中涉及两个对象,客户和商户,根据以上描述,在ROSE中建模的“下订单”活动图如图4.16所示。
4.5数据库建模
在以上小节本文成功建立了江西师范大学网上商城的业务流程图、需求模型、静态模型和动态模型,接下来就要介绍如何通过已建立L1ML静态结构模型中的类图转换为数据库模型。在类图转换为数据库模型,控制类和边界类不需要转换为系统数据库模型,这些类是为了实现用例的流程而产生的类,所以只有那些持久存储信息的实体类需要转换为数据库模型。转换过程由于篇幅问题不再一一叙述,如图4.17系统实体类图转换的数据库模型图。
系统的数据库模型图建立之后,将模型图映射为数据表,此处数据库模型中的属性映射为数据表的列,系统的数据结构表如下表所示。 4.6物理建模
完成系统的逻辑设计后,下一步要定义设计的物理实现,为了将逻辑设计图转化成实际的事物,面向对一象系统的物理建模有两种图:组件图和配置图。组件图是系统实现视图的图形表示,描述了系统的各种组件和组件之间的依赖关系。配置图是系统执行过程中资源元素的配置情况以及软件到这些资源元素的映射,描述了系统中硬件和软件的物理结构。 (1)组件图
组件是表示将类、接口等打包而形成的物理模块。组件图是用来描述代码的物理模块之间的关系,显示了代码的结构。组件图能够帮助客户和系统开发人员理解最终的系统结构。根据上文对江西师范大学“网上商城”的逻辑视图的分析,在ROSE中得到系统的组件图,图4.18所示,组件图中只有用虚线表示的依赖关系。
2.配置图
配置图用来表示系统的运行结构或者系统软件和硬件组织之间的关系,由节点和节点之间的联系构成,配置建模就是将软件系统在互联网上的运作方式模式化,南昌大学“网上商城”是一个基于其数据库和校园网的应用系统,根据第三章中电子商务系统多层B/S体系结构,“网上商城”的系统配置图如图4.19。
4.7小结
电子商务系统是一个结构复杂、规模庞大的系统,根据本文提出的基于UML的系统建模过程,本章以江西师范大学“网上商城”为实例,对其进行了系统的需求分析,建立了系统的需求模型、系统的静态结构模型、系统的动态结构模型、系统的数据库模型、系统的物理模型。确立了系统的功能模块,分别建立了业务流程图、用例图、类图、顺序图和活动图、数据库模型和数据表、组件图和配置图。
第5章基于数据挖掘的商品订单分析
电子商务的迅速发展使其规模越来越复杂,客户获得有效商品信息的难度也在增加,因此如何增加商品信息的针对性,提高网站的可用性成为了现今电子商务研究的热点。国内对该热点的研究很少,但是也有了一些研究成果,比如王兆红((2005)利用关联规则提出了商品的最佳打包组合:金伟健,金文进(2010)从理论上提出了基于关联规则的商品推荐模型;章杰鑫,张烈平(2009)提出了时序关联规则挖掘算法,并通过模拟超市数据预测了顾客在时间单位内的商品关联规则,使企业更好的了解客户需求。本文应用数据挖掘的关联规则对商城的“订单分析”功能进行了分析和设计。首先对商城历史订单进行数据预处理,然后应用关联规则挖掘客户购买商品的关联关系,这样商户可以掌握客户的购物兴趣,设置相应的捆绑或交叉销售,使商户在降低成本的同时为广大师生提供更好的生活服务,增加现有客户的满意度。 5.1数据挖掘技术 5.1.1数据挖掘的概念
1997年SAS研究所将数据挖掘定义为将大量相关数据进行探索,最后建立相关模型的方法;1999年Bhavani将数据挖掘定义为一个过程,即利用数学,统计和模式识别技术,在大量的数据中发现新的趋势、新关系和模式的过程;最后一种是最具有影响力且至今被广泛采用的Usama M. Fayyad等给出的,即数据挖掘( Data Mining)是从大量的、有噪声、模糊的、不完全的、随机的数据中挖掘出隐含的、未知的、用户可能感兴趣的但又有潜在价值的知识和信息的过程。 5.1.2数据挖掘的功能一可以挖掘什么类型的模式
数据挖掘的目标从大量的数据中发现隐含的、有意义的知识并对现有数据记录进行分析,预测未来趋势和行为,做出基于知识的决策,主要有以下功能。
1.描述功能:将数据库中的对象通过数据分类、聚类分析、数据汇总与归纳、概括等过程最终获得数据简明、准确的描述。
第四篇:探究统一建模语言在面向对象分析与设计中的应用论文
一、UM L 与R a t io n a l r o s e 的特点
u M L 是编制软件的标准语言, 拥有着强大的功能和良好的定义, 主要特点有统一性、非过程性和面向对象性等。R at io n al or s e 是由美国软件公司R at i on al 所研发出来的, 它目前对面向对象分析, 设计和建模市场有着重要的主导作用, 是重要的可视化软件研发工具。它的主要特点包括支持面向对象建模分析u M L、支持上升螺旋式研发开发过程、支持往返研发工程、支持多种语言设计程序和团队的研发开发。行为用例的划分, 从而产生交互时间及动态的用例顺序图。其次在此基础上, 将系统的类抽象化, 弄清各模块的中间联系, 从而画出适当的类图, 再在分析完后形成构建图,这些步骤都不需要去考虑具体实践的过程, 使用者会用自己的眼光分析和建立起完整的模型, 形成编码时所需的大概框架。
二、统一建模语言U M L 概述
2.1 u M L 的主要内容和建模机制。
u M L 吸取了目前许多的新技术, 是建模语言的可视化标准, 并且在面向对象分析上还吸取和发展了非面向对象分析的优势, 提出了建模机制, 在实际应用中对系统大量的可视化图形进行了阐述进而使开发人员和使用客户全方面准确的认识系统, 防止开发过程中的描述不明确的情况发生11 1 , 从而满足客户的真正的需求。u M L 和具体的过程并没有什么直接的关系,而是一个独立的过程, 因此可以运用在各个开发过程和软件系统中。规范U M L 面向对象分析的设计与开发的过程和方法, 提供面向对象分析中的高级概念的条件支持, 强调软件开发框架和组建的重要性。u M L 主要重视满足客户的需求, 以客户的需求作为开发过程中的核心与关键, 自始至终都保持着系统与客户需求的一致, 准确表达和适用客户所需, 从而提高系统效率, 简化思路和规范方法来指导软件的来发, 用统一的方法分析系统的静动态的各关系中的逻辑关系。它可以被用于U S e Cas e 的驱动开发也可以适用在其它的软件开发中, 建立起系统的模型。
2 2 U M L 的表示法。
通过运用各式各样的模型图来描述系统, 充分表现出u M L 可见化建模语言的特点。一组元素的图形代表着图, 将图画变成顶点和弧的组合连通图, 从不同角度来画图将系统变成可视化的投影。在理论基础上,任何事物和它们的关系都可以组成要素形成一副图, 但在现实中, 只存在一些少量的常见图和组合。
2.3 运用u M L 进行系统软件建模的过程。
在运用u M L进行描述系统软件建设的总体需求的过程中, 搭建起用例模型及静态模型的系统结构体系。依照面向对象的基本原则运用高级试图用例视图, 以功能区分的角度实现系统.
三、统一建模语言在面向对象分析与设计中的应用
3.1 u M L 及其与面向对象分析的集成。
u M L 是包含多方面的通用标准可视化的面向对象建模语言, 是计算机技术领域中的非常重要的成果, 极其强调结构模型中的系统对象的操作属性和类的关系, 及其行为模型中的交互作用和合作性历史状态的对象12 1。身为一种可视化系统建模语言工具, 是一种独立的开发过程, 可以适用于各个阶段的过程。面向对象的设计与分析中最关键和最基本的活动便是建模,它是面向对象分析与设计的开始和关键。按照不同阶段的要求和行为来选择不同形态的行为模型。
3 2 u M L 面向对象分析过程。
首先, 通过利用u M L 的模型用例图来确定出系统边界和活动功能, 识别出系统的准确需求。然后运用用例模型的分析和描述识别出问题的本质类和对象。再通过U M L 的图揭示它们之间的关系和结构组成。
3.3 在实际系统中的应用。
u M L 面向对象分析的方法在上述中已经有了大概的介绍,u M L 主要是图形化符号的建模语言, 运用好的工具来获得好的最终结果。接下来以自动售货机作为例子进行介绍, 因为自动售卖机是顾客自己投人硬币进行购物的无人售货系统, 同时系统也可以自己进行对于纸币的真假辨别, 会根据顾客所付硬币及所选产品进行找零及出货的整个过程, 当顾客取消购买也可自动将货币退回。自动售卖机的系统主要是先识别出角色再识别出系统的用例模型, 系统需要识别出各种的角色, 分析出正确的用例。
第五篇:面向对象程序设计教程 答案
面向对象程序设计教程(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) 在整型指针变量p
2、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个对象p
1、p2和p3,作为该类的数据成员,则p
1、p2和p3被称为子对象。当建立Whole类的对象w时,子对象p
1、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; }
【输出结果】
30
【问题分析】
本题主要考查“在类的范围内所有对象共享静态成员的数据”的含义。 【结果分析】
程序中语句1对静态成员sumnum进行初始化,sumnum得到初值120。执行语句2时,调用构造函数,sumnum变为100。接着语句3,再调用构造函数,sumnum变为30。
五、 程序设计题
(1) 声明一个Circle类,有数据成员radius(半径)、成员函数area(),计算圆的面积,构造一个Circle的对象进行测试。 【问题分析】
本题主要考查类定义的形式、对象成员访问和对象初始化的方法。要求理解类和构造函数的真正含义,特别注意如何将客观事物的属性和行为抽象为类的成员。 【解题思路】
① 题目中已给出了类的基本部分,需要增加一个构造函数来初始化数据成员radius。
② 为了程序的通用性,圆的半径由键盘输入。 【参考程序】
// xt3_1.cpp
#include