《第三章一个面向对象的C程序实例》由会员分享,可在线阅读,更多相关《第三章一个面向对象的C程序实例(20页珍藏版)》请在金锄头文库上搜索。
1、第三章 一个面向对象的C+程序实例北京信息工程学院计算机系牟永敏牟永敏第三章 一个面向对象的C+程序实例 从这一章开始我们将进行面向对象程序设计实践,通过一个面向对象的C+ 程序实例,说明怎样分析实际问题建立起对象模型,以及怎样用C+ 语言实现所得到的设计模型。通过本章学习,一方面可以进一步加深对面向对象分析及设计方法的理解,另一方面也能对面向对象的C+ 程序概貌有一个初步了解。 3.1面向对象分析与设计 3.1.1需求陈述一个简单图形程序的需求: 在显示器荧光屏上圆心坐标为(100,100)的位置上,画一个半径为40的圆,在圆心坐标为(200,300)的位置上,画一个半径为20的圆,在圆心坐
2、标为(400,150)的位置上,画一条弧,弧的起始角度为30,结束角度为120,半径为50。注意:功能需求必须是可测试的。如:系统速度要快。(要有一个准确的值)3.1.2 面向对象分析 (1) 面向对象分析就是抽取和整理用户需求并建立问题域精确模型的过程。面向对象分析的关键工作,是分析 确定问题域中的对象及对象间的关系,从而建立起问题域的对象模型。 3.1.2 面向对象分析 (2)1.确定对象 使用“语法分析 ”方法。在需求陈述中包含的名词或名词短语是对象的候选者,它们有下列一些: 显示器荧光屏,圆心坐标,位置,半径,圆,弧,起始角度,结束角度。 3.1.2 面向对象分析 (3) “显示器荧光
3、屏”是一种输出设备,是运行程序的物质基础(硬件平台),应该从候选对象中删去。“圆心坐标”和“半径”实质上是圆和弧的基本属性,并不需要独立存在,因此也应该从候选者中删去。“位置”实际上是指圆心的位置,也就是圆心坐标,没必要重复列出。“起始角度”和“结束角度”实质上是弧的属性,也应该从候选者中删去。最后得出的对象是,圆(Circle)和弧(Arc),更确切地说,是圆和弧两类对象。 在本问题域中实际上有两个具体的圆和一个具体的弧,换句话说,有圆类的两个实例和弧类的一个实例。 3.1.2 面向对象分析 (4)2确定属性 圆的两个基本属性是圆心坐标和半径,弧的基本属性有圆心坐标,半径,起始角度和结束角度
4、。不可能在需求陈述中找到所有属性,还必须借助领域知识和常识,才能分析得出所需要的全部属性。圆和弧都应该再增加一个属性可见性 3.1.2 面向对象分析 (5)3确定服务 在分析阶段可以认为,每个属性都是可以访问的。所谓可以访问是指提供了访问对象属性的对外接口。(由对象主动地向外界提供服务) 分析 这个程序应完成的功能可知,圆和弧都应该提供在荧光屏上“画自己”的服务。相应地也应该提供“隐藏自己”这样一个服务。 圆和弧分别有各自的属性和服务,如图3.所示。 3.1.2 面向对象分析 (6)3.1.3面向对象设计(1) 设计就是把通过分析得出的对程序的准确需求转变成实现程序的方案的过程。主要完成下述工
5、作 : 1.建立类等级 面向对象程序的一个突出优点来源于继承性。应该尽量抽取出相似类的公共属性和公共服务,以建立这些相似类的父类,并在类等级的适当层次中正确地定义各个属性和服务。 图3所示的对象 模型。为简明起见,图中没有列出读写属性值的常规服务。 3.1.3面向对象设计(2)3.1.3面向对象设计(3)定义属性 所谓定义属性就是要确定每个属性的数据类型和数据结构,同时还要确定每个属性的访问权限(通常被定义在保护部分或私有部分)。3定义服务 实现“显示”服务的算法概括来说就是,把“可见性”属性设置为true,然后调用相应的库函数用当前的前景颜色画出所要的图形。 3.2 用C+ 语言实现(1).
6、定义类与派生类1. 定义类:class Location 以下说明数据成员 以下说明成员函数 ;2 . 在定义派生类的时候,必须明确指出它的父类是谁。做法是,在派生类类名后面加一个冒号“:”,冒号后写上访问权修饰符,然后再写上父类名。 例如,定义从“位置”类派生出的“点”类的框架如下: class Point :public Location 以下说明数据成员 以下说明成员函数 ;3 . 访问权修饰符影响从父类继承来的成员(包括数据成员和成员函数)在子类中的可访问性。本例中访问权修饰符为Public(公有派生),它的含义是继承来的成员在子类中的可访问性与在父类中的可访问性相同(但是,仅在父类中
7、可直接访问的成员在子类中则不能直接访问)。(2). 说明数据成员 在说明数据成员时,首先要用访问权符指定数据的可访问性,接下来应该用数据类型名表明当前说明的数据的数据类型,随后写出所说明的数据的名字,最后用分号“;”结束对一个数据的说明。在类定义中,共有三种访问权符:1.private为私有的访问权符。为了使得成员仅在说明它的类中可以直接访问,超出该类范围均不能直接访问,则需要在此成员前面使用private访问权符。 2.protected 为保护的访问权符。这个访问权符的含义是,在它下面说明的成员(数据成员或成员函数)仅在本类及其子类中可以直接访问。因此,描述坐标的两个数据成员X和Y在Loc
8、ation类中可直接访问,在其子类Point中也可直接访问继承来的数据成员X和Y。3.public(公有的)具有这种访问属性的成员,可被与该类对象处在同一作用域内的任何一个外部函数使用。 因此,被称为对象与外界的接口。通常,在这部分仅定义一些成员函数,作为该类产生的对象向外界所能提供的服务。(3). 说明和定义成员函数 1.说明成员函数 多数成员函数都是在类定义体内部说明,格式与C语言的格式类似。 2.定义成员函数 多数成员函数都是在类定义体内部说明,在类定义体之外定义。 3构造函数 给变量设置初始值的操作,通常称为初始化。为了方便初始化工作,C+ 语言提供了一类特殊的成员函数,称为构造函数。
9、当创建一个对象时(例如,说明类的一个实例时),系统自动调用构造函数完成初始化工作。为了使编译程序能够很容易地判断出哪些成员函数是构造函数,C+ 语言有下述规定:构造函数的名字必须与类名相同;构造函数的原型说明中没有返回值类型,也就是说,在函数名前面为空白。 举例如下:例如:一个圆类的定义(1)class Circle :Public Point protected: int Radius; public:Circle (int InitX,int InitY,int InitRadius);void Show( ); void Hide( ); int GetRadius( ); 例如:一个圆
10、类的定义(2)Circle:Circle(int InitX,int InitY, int InitRadius):Point(InitX,InitY)Radius = InitRadius;void Circle:Show()Visible = true;circle(X,Y,Radius);void Circle:Hide()int TempColor;TempColor = getcolor();setcolor(getbkcolor();Visible = false;circle(X,Y,Radius);setcolor(Tempcolor);int Circle:GetRadius
11、()return Radius; 小结(1) 用面向对象程序设计方法,解决实际工程的基本步骤如下:(1)面向对象分析: 通过对用户需求的分析,合理地提取问题域中所涉及到类-&-对象。包括:这些类-&-对象中应该包括哪些属性和方法。(2)面向对象设计: 对分析中得到的准确结果,设计出实现程序的方案。小结(2) 包括:建立类之间的继承关系:根据对系统中共性和个性的划分建立类等级即类之间的继承关系(提取公共的属性和服务以建立父类)定义属性:确定属性的数据类型及访问权限。定义服务:确定实现服务的准确算法以及清晰的接口。(3)面向对象实现:选择一种合适的编程语言,实现上述设计。思考题:举例说明类、对象、实例的概念,并解释他们之间的关系。第三章完