面向对象分析和设计初步.pptx
第一章 从过程抽象到数据抽象,1.3 面向对象分析和设计,主要内容,面向对象建模对象模型UML建模技术面向对象分析面向对象设计面向对象实现,1.3.1 面向对象建模,在创建系统之前必须对问题有一个透彻的了解。为了更好的理解问题和描述问题,人们常常采用“建立问题模型”技术。如:建造一座大厦(图纸),拍电影(剧本)模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。模型是一种思考工具,利用这种工具可以把知识规范地无歧义地表示出来。,1.建模的目的:,(1)模型帮助我们将系统可视化,可以更好地理解系统。(2)模型可以让我们直观、详细描述系统的结构和行为,并利用它和同事容易沟通。(3)模型提供了指导我们创建系统的模板,我们可以用它为使用系统的人提供帮助。(4)模型对我们所做的决策进行文档化。,系统越大越需要建立问题模型。为了开发复杂的软件系统,系统分析员应该抽象出目标系统的特性,使用精确的表示方法构造系统的模型,并在设计过程中逐渐把和实现有关的细节加进模型中,直至最终用程序实现模型。,2.建立问题模型方法,从算法的角度建立问题模型:所有的问题都用过程/函数作为主要构造块面向对象的建模:所有的问题都用对象/类作为主要构造块面向对象的建模的方法很多:Rumbaugh-OMTBooch Yourdon-OOA Visio,OMT建模,OMT是著名的对象模型化技术OMT。OMT认为用面向对象方法开发软件,通常需要建立三种形式的模型,它们分别是:1.描述系统数据结构的对象模型(基本、核心)2.描述系统控制结构的动态模型3.描述系统功能的功能模型这三个模型从3个不同但又密切相关的角度模拟目标系统。一个典型的软件系统组合了上述三方面内容:它使用数据结构(对象模型),执行操作(动态模型),并且完成数据值的变化(功能模型)。,分析:,对象模型是三个模型中最关键的一个模型。它的作用是描述系统的静态结构,包括构成系统的类和对象,它们的属性和操作,及它们之间的关系。(定义“对谁做”)动态模型着重于系统的控制逻辑。要想对一个系统了解得比较清楚,还应当考察在任何时刻对象及其关系的改变。系统的这些涉及时序和改变状况用动态模型来描述。(定义“何时做”)功能模型着重于系统内部数据的传送和处理。功能模型表明,通过计算,从输入数据能得到什么样的输出数据,不考虑参加计算的数据按什么时序执行。(定义“做什么”),最核心的模型-对象模型,面向对象方法强调围绕对象而不是围绕功能来构造系统。对于大系统:3个模型必不可少.对于小系统:对象模型必不可少。对象模型是上述三种模型中最重要、最基本、最核心的模型。对象模型表示静态的、结构化的系统的“数据”性质。它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。,OMT对象模型化技术把分析时收集的信息构造在三类模型中,即对象模型、动态模型和功能模型。,这个模型化的过程是一个迭代过程。通过不断更新、细化,直到切合系统的真正需求为止。,为了建立系统模型,需要定义一组图形符号,并且规定一组组织这些符号以表示特定语义的规则。如对象模型,需要包含下列符号:表示类的符号(应该既能表示属性又能表示服务);表示对象(类实例)的符号;表示继承关系的符号;表示类和(或)对象 间其他关系的符号。统一建模语言(UML)为建立系统模型提供了一个图形化的表示手段,UML建模技术,1.UML(Unified Modeling Language,统一建模语言)UML是软件和系统开发的标准建模语言。它主要以图形的方式对系统进行分析、设计。UML是在多种面向对象分析与设计方法相互融合的基础上形成的,是一种专用于系统建模的语言。它为开发人员与客户之间,以及开发人员之间的沟通与理解架起了“桥梁”。,2.UML系统视图,UML 是用来描述模型的,它用模型来描述系统的结构、或静态特征、以及行为或动态特征它从不同的视角为系统的架构建模,形成系统的不同视图(view)每一种UML 的视图都是由一个或多个图(diagram)组成的,一个图就是系统架构在某个侧面的表示,它与其它图是一致的,所有的图一起组成了系统的完整视图。UML 提供了九种不同的图描述系统模型。可以分成两大类:一类是静态图。包括用例图、类图、对象图、组件图、配置图另一类是动态图。包括序列图、协作图、状态图和活动图,UML图(preview),1)用例图,2)时序图:打印,3)时序图:打电话,4)协同图:打印,5)状态图:电梯,6)封包,7)活动图:磁盘,8)构件分布图,9)构件图的组合,10)配置图:主机与外围设备,11)类图,类图用于表示类的存在和类与类之间的相互关系,是从系统构成的角度来描述正在开发的系统。类的表示:,类图,12)对象图,类图表示类和类与类之间的关系,对象图则表示在某一时刻这些类的具体实例和这些实例之间的具体连接关系。由于对象是类的实例,所以UML 对象图中的概念与类图中的概念完全一致。对象图可以看作类图的示例,帮助人们理解一个比较复杂的类图。对象图也可用于显示类图中的对象在某一点的连接关系。对象的图示方式与类的图示方式几乎是一样的,主要差别在于对象的名字下面要加下划线。对象名有下列三种表示格式:,13)关系,类图由类和它们之间的关系,组成类与类之间通常有四种关系:泛化关系(Generalization)关联关系(Association)聚合关系(Aggregation)合成关系(Composition)依赖关系(Dependency)其中,聚合关系(Aggregation),合成关系(Composition)属于关联关系(Association)。泛化关系表现为继承或实现关系(is a),关联关系表现为变量(has a),依赖关系表现为函数中的参数(use a)。,泛化关系:表示为类与类之间的继承关系,接口与接口之间的继承,类对接口的实现关系。表示方法:用一个空心箭头实线,箭头指向父类。或空心箭头虚线,如果父类是接口。,关联关系:类与类之间的联接,它使一个类知道另一个类的属性和方法。表示方法:用 实线箭头,箭头指向被使用的类。在示范代码中,Employee可以有0个或更多的TimeCard对象。但是,每个TimeCard只从属于单独一个Employee。,聚合关系:是关联关系的一种,是强的关联关系。聚合关系是整体和个体的关系。关联关系的两个类处于同一层次上,啊聚合关系两个类处于不同的层次,一个是整体,一个是部分。表示方法:空心菱形实线箭头,箭头指向部分。,合成关系:是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期,合成关系不能共享。表示方法:实心菱形实线箭头,,Employee和TimeCard的关系或许更适合表示成“合成”,而不是表示成“关联”。,依赖关系:是类与类之间的连接,表示一个类依赖于另一个类的定义。例如如果A依赖于B,则B体现为局部变量,方法的参数、或静态方法的调用。表示方法:虚线箭头,UML开发工具,IBM Rational RoseMicrosoft Visio-UML 模型图Borland TogetherJude(Java and UML Developers Environment),一个小巧实用的UML建模软件,是一个中日合作采用XP开发方式纯JAVA开发的软件,也可以说是半个国产软件EclipseUMLRoseStarUML:一款开放源码的UML开发工具,是由韩国公司主导开发出来的产品。,1.3.2 面向对象分析(OOA),1.基本内涵 面向对象的分析就是运用面向对象方法进行系统分析,抽取和整理用户需求并建立问题域精确模型的过程。它强调运用面向对象方法进行分析,用面向对象的概念和表示法表达、分析结果。,2.基本任务,OOA分析工作主要包含3项内容:理解用户需求;表达用户需求;验证用户需求。,3.基本步骤,面向对象分析工作大体上按照下列顺序进行:第一步,寻找类&对象;第二步,确定对象之间的关联;第三步,定义对象的属性;第四步,定义对象的服务。事实上,分析工作不可能严格地按照预定顺序进行,系统的模型往往需要反复构造多遍才能建成。通常,先构造出模型的子集,然后再逐渐扩充,直到完全、充分地理解整个问题,才能最终把模型建立起来。,1)确定类&对象,步骤:找出侯选的类&对象。对象是对问题域中有意义的事物的抽象,它们既可能是物理实体,也可能是抽象概念。通常,将需求陈述中的名词 或名词短语作为类&对象的候选者。,筛选出正确的类&对象。找出候选的类&对象之后,还应该严格考察每个候选者,从中去掉不正确的或不必要的。删除的依据如下:冗余的:两个类名表示了相同的信息,应该保留较全面的类&对象。无关的:与目标系统无关的类&对象。笼统的:用精确的代替模糊、笼统的类&对象。无关的属性:去掉类&对象中无关的属性。操作:通常用动词定义类中的操作。实现:在系统分析阶段应该少考虑或不考虑怎样实现目标系统。,2)确定关联,在需求陈述中使用的描述性动词或动词词组,通常表示关联关系。因此,在初步确定关联时,大多数关联可以通过直接提取需求陈述中的动词词组而得出。分析员还应该与用户及领域专家讨论问题域实体间的相互依赖、相互作用关系,根据领域知识再进一步补充一些关联。最后,还需对初步确定的关联进行进一步筛选,以去掉不正确的或不必要的关联。三个或三个以上对象之间的关联,大多可以分解为二元关联。,3)确定属性,分析并确定每个对象有哪些特性。确定属性的过程包括分析和选择两个步骤。通常,在需求陈述中用名词词组表示属性。应该仅考虑与具体应用直接相关的属性,不必考虑那些超出所要解决的问题范围的属性。,4)确定服务,分析并确定每个对象有哪些对属性的操作。在确定类中应该有的服务时,既要考虑该类实体的常规行为,又要考虑为完成本系统功能所需要提供的服务。,5)识别继承关系,确定了类中应该定义的属性和服务之后,就可以利用继承机制共享公共性质,并对系统中的类加以层次化组织。一般说来,可以使用两种方式建立继承关系:自底向上:抽象出现有类的共同性质泛化出父类,这个过程实质上模拟了人类归纳思维过程。自顶向下:把现有类细化成更具体的子类,这模似了人类的演绎思维过程。,OOA模型(based on UML):,1.3.3 面向对象设计(OOD),面向对象分析是提取和整理用户需求,并建立问题域精确模型的过程。面向对象设计则是把分析阶段得到的需求转变成符合成本和质量要求的系统实现方案的过程。从面向对象分析到面向对象设计,是一个逐渐扩充模型的过程。或者说,面向对象设计就是用面向对象观点建立求解域模型的过程。,1.发展过程_I,1)早期的OOD(80年代至90年代初)1982 年G.Booch发表“Object-Oriented Design”,首次称“面向对象的设计”。1986 年发表“Object-Oriented Development”,较完整地阐述了OOD思想。,两个术语都用OOD作为缩写,内容上也没有根本区别。,1983年R.J.Abbott提出正文分析方法,用规范的英语描述对一个问题的解释,然后从描述中提取对象及其特征。例:名词对象,动词操作。被后来的许多OOD方法所采用。,1.发展过程_II,1986年后,相继出现了一批(早期的)OOD方法。如:Booch86Object-Oriented Development(面向对象的开发)GOODGeneral Object-Oriented Development(通用面向对象的开发)HOODHierarchical Object-Oriented Design(层次式面向对象的设计)OOSDObject-Oriented Structured Design(面向对象的结构设计),1.发展过程_III,2)现今的OOD(90年代以后)特点:以面向对象的分析为基础,一般不依赖结构化分析。与相应的OOA方法共同构成一种OOA&D方法体系。OOA和OOD采用一致的概念与原则,但属于软件生命周期的不同阶段,有不同的目标及策略。较全面地体现面向对象方法的概念与原则。大多数方法独立于编程语言,通过面向对象的分析与设计所得到的系统模型可以由不同的编程语言实现。,2.定义,面向对象的设计(OOD)就在是OOA模型基础上运用面向对象方法进行系统设计,目标是产生一个符合具体实现条件的OOD模型。,OOD与OOA、OOP关系:OOD是OO软件工程中承前启后的中间环节往前OOA(全部用OO概念建模)往后OOP(用OOPL支持的OO概念编程)OOD使用与OOA和OOP一致的概念建立完整的、可实现的系统设计模型。,OOA与OOD的目标、内容OOA主要内容是研究问题域和用户需求,运用面向对象的观点和原则发现问题域中与系统责任有关的对象,以及对象的特征和相互关系。目标是建立一个直接映射问题域,符合用户需求的OOA模型。OOD主要内容是以OOA模型为基础,按照实现的要求进行设计决策,包括全局性的决策和局部细节的设计。目标是产生一个满足用户需求,并且完全可实现的OOD模型。全局性设计决策:体系结构、分布方案、并发控制、人机交互、数据管理等。OOD方法应支持用户以OO概念表达对这些问题的设计。局部细节的设计:对每个对象类的每个属性和每个服务给出详细的定义。,3.设计内容,通常,一个实用的软件系统在逻辑上由问题域子系统、人机交互子系统、任务管理子系统和数据管理子系统等四大部分组成。针对上述四个部分,在OOD中进行以下四个相应的活动:设计问题域部分;设计人机交互部分的;设计任务管理部分;设计数据管理部分。,4.设计准则_I,模块化 面向对象软件开发模式,很自然的支持了把系统分解成模块的设计原则:对象就是模块。抽象 面向对象方法不仅支持过程抽象,而且支持数据抽象。类实际上是一种抽象数据数据类型。信息隐藏 在面向对象方法中,信息隐藏通过对象的封装性实现:类结构分离了接口与实现,从而支持了信息隐藏。,弱耦合 在面向对象方法中,耦合主要指不同对象之间相互关联的紧密程度。一般说来,对象之间的耦合可分为以下两类:交互耦合:对象之间的耦合通过消息来实现,则这种耦合就是交互耦合。继承耦合:继承是一般化类与特殊类之间耦合的一种形式。在面向对象设计时,应尽量降低交互耦合的程度,提高继承耦合程度。,4.设计准则_II,4.设计准则_III,5)强内聚 在OOD中存在以下3种内聚:服务内聚:一个服务应该完成一个且仅完成一个功能。类内聚:一个类应该只有一个用途。一般特殊内聚:设计出的一般特殊结构应该是对相应领域知识的正确抽取,应该符合多数人的概念。在设计时应该力求做到高内聚。,4.设计准则_IV,可重用 重用有两方面的含义:一是尽量使用已有的类(包括开发环境提供的类库,以及以往开发类似系统时创建的类);二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的重复使用性。,OOD模型从两个侧面来描述,1.3.3 面向对象实现,1.基本任务把面向对象设计的结果翻译成用某种面 向对象程序语言书写的面向对象程序。测试和调试编写出的面向对象程序。程序的质量主要由设计的质量决定,应该将大量的时间花在系统分析与设计上,但是所选用的程序语言的特点对程序质量也有重要影响。,2.面向对象语言的选择,面向对象语言可以分为两类:纯面向对象语言。例如:Java,C#,Smalltalk,Eiffel等。混合型面向对象语言(即在过程语言的基础上增加面向对象机制)例如:C+。,选择面向对象语言或工具的原则,计算模式:C/S或B/S运行平台:PC/嵌入式系统/SmartDevice/otherOS平台:Windows/Linux/嵌入式OS/other时间、空间需求可参考的资源语言或工具的功能、类库、配置、发布语言或工具未来的发展前景开发人员的基础项目的未来前景等等,一个面向对象的C+程序实例,1.需求陈述(一个简单图形程序的需求):在显示器荧光屏上圆心坐标为(100,100)的位置上,画一个半径为40的圆,在圆心坐标为(200,300)的位置上,画一个半径为20的圆,在圆心坐标为(400,150)的位置上,画一条弧,弧的起始角度为30,结束角度为120,半径为50。,2.面向对象分析,确定对象 使用“语法分析”方法,在需求陈述中包含的名词或名词短语是对象的候选者,它们有下列一些:显示器荧光屏,圆心坐标,位置,半径,圆,弧,起始角度,结束角度。,分析:“显示器荧光屏”是一种输出设备,是运行程序的物质基础(硬件平台),应该从候选对象中删去。“圆心坐标”和“半径”实质上是圆和弧的基本属性,并不需要独立存在,因此也应该从候选者中删去。“位置”实际上是指圆心的位置,也就是圆心坐标,没必要重复列出。“起始角度”和“结束角度”实质上是弧的属性,也应该从候选者中删去。结论:最后得出的是圆(Circle)和弧(Arc)两类对象。,圆的两个基本属性是圆心坐标和半径。弧的基本属性有圆心坐标,半径,起始角度和结束角度。分析:由于不可能在需求陈述中找到所有属性,还必须借助领域知识和常识,才能分析得出所需要的全部属性。因此,圆和弧都应该再增加一个属性可见性。,确定属性,确定服务,在分析阶段可以认为,每个属性都是可以访问的。所谓可以访问是指提供了访问对象属性的对外接口。(由对象主动地向外界提供服务)分析:由这个程序应完成的功能可知,圆和弧都应该提供在荧光屏上“画自己”的服务。相应地也应该提供“隐藏自己”这样一个服务。,结论:,圆和弧分别有各自的属性和服务,如下图所示。,3.面向对象设计_I,建立类等级 面向对象程序的一个突出优点来源于继承性。应该尽量抽取出相似类的公共属性和公共服务,以建立这些相似类的父类,并在类等级的适当层次中正确地定义各个属性和服务。简单图形程序的对象模型如下图(为简明起见,图中没有列出读写属性值的常规服务)。,3.面向对象设计_II,定义属性 所谓定义属性就是要确定每个属性的数据类型和数据结构,同时还要确定每个属性的访问权限(通常被定义在保护部分或私有部分)。定义服务 实现“显示”服务的算法概括来说就是,把“可见性”属性设置为true,然后调用相应的库函数用当前的前景颜色画出所要的图形。,4.面向对象实现_I,圆类的定义class Circle:public Point protected:int Radius;public:Circle(int InitX,int InitY,int InitRadius);void Show();void Hide();int GetRadius();,Circle:Circle(int InitX,int InitY,int InitRadius):Point(InitX,InitY)Radius=InitRadius;void Circle:Show()Visible=true;circle(X,Y,Radius);,4.面向对象实现_II,4.面向对象实现_III,void Circle:Hide()int TempColor;TempColor=getcolor();setcolor(getbkcolor();Visible=false;circle(X,Y,Radius);setcolor(Tempcolor);int Circle:GetRadius()return Radius;,5.小结,用面向对象程序设计方法,解决一个简单的实际工程的基本步骤如下:1)面向对象分析:通过对用户需求的分析,合理地提取问题域中所涉及到类-&-对象。包括:这些类-&-对象中应该包括哪些属性和方法。,2)面向对象设计:对分析中得到的准确结果,设计出实现程序的方案。包括:建立类之间的继承关系:根据对系统中共性和个性的划分建立类等级即类之间的继承关系(提取公共的属性和服务以建立父类)定义属性:确定属性的数据类型及访问权限。定义服务:确定实现服务的准确算法以及清晰的接口。3)面向对象实现:选择一种合适的编程语言,实现上述设计。,1.3.4 Form C-C+,C+是C语言的超集,增加了面向对象部分,是OOP的第一个大众化版本。C+语言具有下列主要特点:C+完全兼容C。大多数的C语言代码略作修改或不修改就可在C+的集成环境下运行。C+作为一种面向对象的程序设计语言。用C+设计的程序扩充性强。C+在面向对象的程序设计语言方面获得主导地位,很大程度上是由于它继承了C语言的主要特征,再加上它加强了数据类型的检查机制,引入了类的概念等。从C+的名字可以看出它是C的超集。C+既可用于面向过程的结构化程序设计,又可用于面向对象的程序设计,是一种功能强大的混合型的程序设计语言。,1 C+程序的基本框架,/This is a simple C+program.#include using namespace std;int main()coutThis is a simple C+program.endl;return 0;,2 C+数据类型,C+的基本数据类型有整型(int)、字符型(char)、浮点型(float、double)、布尔型(bool)、空类型(void)等类型。void为无值型:void show();int show(void)C+的构造数据类型是由基本数据类型构造而成的。C+语言中的构造数据类型有:数组、指针、枚举、引用、结构体、联合、类。,2.1指针,变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示“指向”。符号“*”称为指针运算符。定义指针变量的一般形式为:基类型*指针变量名例如:int*i_pointer;float*f_pointer;,在使用指针之前,一定要先使指针有明确的指向。那么,怎样使一个指针变量指向另一个变量呢?可以使用如下的赋值语句。例如:int*i_pointer1,*i_pointer2;int i,j;i_pointer1=&i;i_pointer2=&j;其中,“&”是地址运算符,&i就是取变量i在内存中的地址。,指针变量的引用在定义了指针变量并明确了它的指向后,就可以使用指针变量了。利用指针变量,提供了一种对变量的间接访问形式。对指针变量的引用形式为:*指针变量其含义是指针变量所指向的值。指针变量作函数的参数函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将个变量的地址传送到另一个函数中。由于被调用函数中获得了所传递变量的地址,因此在该地址空间的数据当函数调用结束后被物理地保留下来。,2.2引用,引用是C+语言中对一个变量或常量标识符起的别名。例如,已经定义了一个变量val,然后再建立一个对这个变量的引用rval,就为变量val起了一个别名,val和rval就是指的同一个变量,它们的使用方式也完全一样。说明一个引用的方式如下:int val;/定义vaL是整型变量int&rval=val;/声明rvaL是val的引用说明一个引用时,在引用标识符的前面加上“&”,后面跟上它所引用的标识符的名字。当编译程序看到时,就不为其后面的标识符分配内存空间,而只是简单地将它所引用的那个标识符所具有的内存空间赋给它。,引用的作用:1-引用作函数参数引用在一般场合是没有什么用途的,单纯为一个变量取个别名也没有什么意义。引用最大的用途是作为函数的参数或返回值类型,从而扩充函数传递数据的功能。我们知道,引用是它所引用的变量的一个别名,它们实际上是同一回事。因此,当函数的形参是引用类型时,它实际上是对实参所代表的变量的引用,它自己不具有独立的内存空间。这种实参传递给形参的方式称为按引用传递。例6-16 利用“引用形参”实现两个变量的值的互换,2-引用返回值返回引用值的函数在一般情形下并不多见,但是如果需要让函数调用作为左值时,就需要将函数返回值设计为是引用类型。函数的返回值为引用类型表示该函数的返回值是一个内存变量的别名。可以将函数调用作为一个变量来使用,可以为其赋值。例6-18 定义了一个求两个数中最小值的函数,函数的参数是两个整型变量返回值是对这两个数中值较小的那个变量的引用。,2.3常变量(const变量),C+中使用const修饰符来定义常量。const可以与指针一起使用,它们的组合情况较复杂,可归纳为三种:指向常量的指针、常指针和指向常量的常指针。,1指向常量的指针指向常量的指针是指一个指向常量的指针变量。在指针定义语句的类型前加const修饰符,表示指向的对象是常量。例如:const char*namechen;/声明指向常量的指针这个语句的含义为:声明一个名为name的指针变量,它指向一个字符型常量,初始化name为指向字符串“chen”。2常指针常指针是指把指针本身是声明为常量,而不是将它指向的对象声明为常量。在指针定义语句的指针名前加const修饰符,表示指针本身是常量。例如:char*const name=chen;/常指针这个语句的含义为:声明一个名为name的指针常量,该指针是指向字符型数据的常指针,用字符串常量“chen”的地址初始化该常指针。,3指向常量的常指针指向常量的常指针是指这个指针本身不能改变,它所指向的值也不能改变。要声明个指向常量的常指针,二者都要声明为const,并且必须在定义时进行初始化。例如:const char*const namechen;/指向常量的常指针这个语句的含义是:声明了一个名为name的指针常量,它是一个指向字符型常量的常指针,用字符串常量chen的地址初始化该指针。,2.4定义变量初值,定义变量的一般形式为:变量类型 变量名表列;变量赋初值C+语言允许在定义变量的同时使变量初始化。如:int a=1;/指定 a为整型变量,初值为 1float pi=3.1415;/指定 pi为单精度浮点型变量,初值为 3.1415也可以使被定义的变量的一部分赋初值。如int a,b,c1;/表示指定a、b、c为整型变量,只对c初始化,c的初值为1如果对几个变量赋予同一个初值,不能写成int a=b=c=1;而应写成int a=1,b=1,c=1;,可在程序中随意定义变量char*name(“Smith”)for(int i(0);i6;i+);,2.5 C+的运算符,new 动态内存分配delete 回收new分配的内存动态:域作用符:对数据成员和成员函数的限定,3.c+中的new/delete,取代 malloc/free new/delete有什么好处?malloc/free只是对内存进行分配和释放;new/delete还负责完成了创建和销毁对象的任务。另外,new的安全性要高一些,因为new返回的就是一个所创建的对象的指针,对于malloc来说返回的则是void*,还要进行强制类型转换,这是一个危险的漏洞。最后,我们可以对new/delete重载,使内存分配按照我们的意愿进行,这样更具有灵活性,malloc则不行。,new的使用:type*p=new typetype*p=new type(初值)type*p=new type数组大小int*p=new int;int*p=new int(50);int*p=new int10;std:string*stringPtr1=new std:string;std:string*stringPtr2=new std:string100;delete的使用:delete stringPtr1;/删除一个对象 delete stringPtr2;/删除一个对象数组NOTEnew创建的内存空间必须由delete回收new创建内存空间不成功返回NULL指针(0)int*p=new int10;if(p=0)cout“Run out of memory”,c+标准库与Namespace,C+标准库很大:在C+标准中,关于标准库的规格说明占了密密麻麻300多页,这还不包括标准C库,后者只是 作为参考包含在C+库中。C+库并非提供了一切(很明显的是,没有提供并发和图形用户接口的支持),但确实提供了很多。几乎任何事你都可以求助于它。标准库组织因为标准库中东西如此之多,你所选择的类名或函数名就很有可能和标准库中的某个名字相同。为了避免这种情况所造成的名字冲突,实际上标准库中的一切都被放在名字空间std中。,具体组织情况:1-文件名称:早期C+标准库放在,等头文件中后来的C+标准库引入namespace:为包装在std的那部分标准库创建新的头文件名。生成新头文件的方法仅仅是将现有C+头文件名中的.h 去掉。所以变成了,变成了,等等。对于C头文件,采用同样的方法,但在每个名字前还要添加一个c。所以C的变成了,变成了,等等。实际来说,下面是C+头文件的现状:旧的C+头文件名如将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在名字空间std中。新的C+头文件如包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中。(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文件和新头文件中的实体不一定完全对应。)标准C头文件如继续被支持。头文件的内容不在std中。具有C库功能的新C+头文件具有如这样的名字。它们提供的内容和相应的旧C头文件相同,只是内容在std中。,2-库中的一切几乎都是模板。这里有一个basic_string模板的完整声明,以及建立在它之上的string类型定义(typedef);可以在头文件中找到它:namespace std template,class Allocator=allocator class basic_string;typedef basic_string string;,Namespace,例如,假设library1.h定义了一些常量,其中包括:const double lib_version=1.204;类似的,library2.h也定义了:const int lib_version=3;很显然,如果某个程序想同时包含library1.h和library2.h就会有问题名字冲突比较好的方法是使用C+namespace。namespace本质上和使用前缀的方法一样,只不过避免了别人总是看到前缀而已。,namespace sdm const double book_version=2.0;class handle.;handle用户于是可以通过三种方法来访问这一名字空间里的符号:将名字空间中的所有符号全部引入到某一用户空间;将部分符号引入到某一用户空间;或通过修饰符显式地一次性使用某个符号:,1-将名字空间中的所有符号全部引入到某一用户空间void f1()using namespace sdm;/使得sdm中的所有符号不用加修饰符就可以使用cout book_version;/解释为sdm:book_version.handle h=gethandle();/handle解释为sdm:handle,/gethandle解释为sdm:gethandle.,2-将部分符号引入到某一用户空间;void f2()using sdm:book_version;/使得仅book_version不用加修饰符就可以使用cout book_version;/解释为sdm:book_version.handle h=gethandle();/错误!handle和gethandle都没有引入到本空间.,3-或通过修饰符显式地一次性使用某个符号:void f3()cout sdm:book_version;/使得book_version在本语句有效.double d=book_version;/错误!book_version不在本空间handle h=gethandle();/错误!handle和gethandle都没有引入到本空间.,本节小结,面向对象建模(目的、3种模型和OMT)UML建模技术(视图、图)面向对象分析(基本内涵、任务和步骤)面向对象设计(设计内容和准则)面向对象实现(任务、程序语言的选择),Homework,什么是模型?开发软件为何要建模?什么是对象模型?功能模型?动态模型?什么是UML?UML有那些图,举例说明。OOA的任务是什么?得到的模型是什么?OOD的任务是什么?得到的模型是什么?OOP的任务是什么?得到的结果是什么?,The End,