第03章 一个面向对象的C++程序实例
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从而建立起问题域的对象模型。
3.1.2 面向对象分析
⒈确定对象
使用“语法分析 ”方法。在需求陈述中包含
的名
词或名词短语是对象的候选者, 它们有下列一些: 显示器荧光屏,圆心坐标,位置,半径,圆, 弧,起始角度,结束角度。
3.1.2 面向对象分析
“显示器荧光屏”是一种输出设备,是运行程序的 物 质基础(硬件平台),应该从候选对象中删去。“圆心 坐标”和“半径”实质上是圆和弧的基本属性,并不需 要独 立存在,因此也应该从候选者中删去。“位置”实际上 是 指圆心的位置,也就是圆心坐标,没必要重复列出。 “起始角度”和“结束角度”实质上是弧的属性,也应 该从 候选者中删去。最后得出的对象是,圆(Circle)和弧 (Arc),更确切地说,是圆和弧两类对象。 在本问题域中实际上有两个具体的圆和一个具体
3.1.2 面向对象分析
⒉确定属性
圆的两个基本属性是圆心坐标和半径,弧的基
本属性有圆心坐标,半径,起始角度和结束角
度。不可能在需求陈述中找到所有属性,还必须
借助领域知识和常识,才能分析得出所需要的全 部属性,圆和弧都应该再增加一个属性-可见性。
3.1.2 面向对象分析
⒊确定服务 在分析阶段可以认为,每个属性都是可以访 问的。所谓可以访问是指提供了访问对象属性的
3.2.2 说明数据成员
在类定义中,共有三种访问权符:
⒈private为私有的访问权符。为了使得成员仅在说明它的类中可以直接 访问,超出该类范围均不能直接访问,则需要在此成员前面使用private 访问权符。 ⒉protected 为保护的访问权符。这个访问权符的含义是,在它下面说明 的成员(数据成员或成员函数)仅在本类及其子类中可以直接访问。因 此,描述坐标的两个数据成员X和Y在Location类中可直接访问,在其子 类Point中也可直接访问继承来的数据成员X和Y。 ⒊public为公有的访问权符。具有这种访问属性的成员,可被与该类对 象处在同一作用域内的任何一个外部函数使用。 因此,被称为对象与外 界的接口。通常,在这部分仅定义一些成员函数,作为该类产生的对象 向外界所能提供的服务。
图3.1 圆类和弧类
3.1.3 面向对象设计
设计就是把通过分析得出的对程序的准确需求 转变成实现程序的方案的过程。主要完成下述工作 : ⒈建立类等级 面向对象程序的一个突出优点来源于继承性。 应该尽量抽取出相似类的公共属性和公共服务,以 建立这些相似类的父类,并在类等级的适当层次中 正确地定义各个属性和服务。 图3.2所示的对象 模型。为简明起见,图中没 有列出读或写属性值的常规服务。
派生类的构造函数不仅要初始化本类中定义的数据成 员,还应该初始化从父类继承来的数据成员,因此应该同 时调用父类的构造函数。C++ 语言的作法是,在定义派生 类构造函数时增加一个“初始化表”。
例如,Point类的构造函数定义如下:
Point :: Point(int InitX, intInitY) : Location(InitX, InitY) { Visible = false; }
第三章 一个面向对象的C++程序
本章概要:
从这一章开始我们将进行面向对象程序设计实践,在实践过程 中一定要始终用上一章所讲述的面向对象理论来指导,要通过实践 进一步学习和体会用面向对象思维解决实际问题的方法。 本章通过一个面向对象的C++ 程序实例,说明怎样分析实际 问题,从而建立起对象模型,以及怎样用C++ 语言实现所得到的 设计模型。通过本章学习,读者一方面可以进一步加深对面向对象 分析及设计方法的理解,另一方面也能对面向对象的C++ 程序概 貌有一个初步了解。
3.2.3 说明和定义成员函数
⒈说明成员函数
原型说明由函数返回值类型,函数名及参数特征三部分内容组成。
例如 :int GetX(); ⒉定义成员函数
多数成员函数都是在类定义体内部说明,在类定义体之外定义。在类定 义体外定义成员函数时,必须在函数名前面冠以类名,类名与函数名之间用 作用域分辨算符“::”来连接。
3.2 用C++ 语言实现 3.2.1 定义类与派生类
⒈ 定义类:
class { ∥以下说明数据成员 ┇ Location
∥以下说明成员函数
┇
};
3.2.1 定义类与派生类
⒉ 在定义派生类的时候,必须明确指出它的父类 是谁。做法是,在派生类类名后面加一个冒号, 冒号后写上访问权修饰符,然后再写上父类名。
(400,150)的位置上,画一条弧,弧的起始角度为
30,结束角度为120,半径为50。 注意:功能需求必须是可测试的。如:系统速度要快。
(要有一个准确的值)
3.1.2 面向对象分析
面向对象分析就是抽取和整理用户需求并建立 问题域精确模型的过程。面向对象分析的关键工 作,是分析 确定问题域中的对象及对象间的关系,
是继承来的成员在子类中的可访问性与在父类中的
可访问性相同(但是,仅在父类中可直接访问的成
员在子类中则不能直接访问)。
3.2.2 说明数据成员
把定义Location类的框架进一步具体化为:
class Location { ∥以下说明数据成员 Protected : int X; int Y; ∥以下说明成员函数 ┇ };
对外接口。(由对象主动地向外界提供服务)
分析:这个程序应完成的功能可知,圆和弧 都应该提供在荧光屏上“画自己”的服务。相应 地 也应该提供“隐藏自己”这样一个服务。
圆和弧分别有各自的属性和服务,如图3.1所示。
圆 圆心坐标 半径 可见性 读/写圆心坐标 读/写半径 读/写可见性 显示 隐藏
弧 圆心坐标 半径 起始角度 结束角度 可见性 读/写圆心坐标 读/写半径 读/写起始角度 读/写结束角度 读/写可见性 显示 隐藏
构造函数的名字必须与类名相同;
构造函数的原型说明中没有返回值类型,也就是说,在函数名前 面为空白。
3.2.3 说明和定义成员函数
例如,Location 类的构造函数定义为:
Location::Location(iΒιβλιοθήκη t InitX, intInitY)
{
X = InitX;
Y = InitY;
}
3.2.3 说明和定义成员函数
本章快速索引
3.1 面向对象分析与设计
3.2 用C++语言实现一个面向对象程序
3.3 小结
3.1面向对象分析与设计 3.1.1需求陈述
一个简单图形程序的需求: 在显示器荧光屏上圆心坐标为(100,100)的位置 上,画一个半径为40的圆,在圆心坐标为(200,300) 的位置上,画一个半径为20的圆,在圆心坐标为
在本问题域中实际上有两个具体的圆和一个具体在本问题域中实际上有两个具体的圆和一个具体的弧换句话说有圆类的两个实例和弧类的一个实的弧换句话说有圆类的两个实例和弧类的一个实312312面向对象分析面向对象分析确定属性确定属性圆的两个基本属性是圆心坐标和半径弧的基圆的两个基本属性是圆心坐标和半径弧的基本属性有圆心坐标半径起始角度和结束角本属性有圆心坐标半径起始角度和结束角度
//获得圆心坐标x的值
3.2.4 完整的C++ 程序
class Point : Public Location//定义Point类(从Location类公有派生) { Protected : Boolean Visible; //说明一个图形可见属性,若Visible为true //图形可见,为false图形不可见 Public : Point(int InitX, int InitY); //在类内仅说明了点的构造函数的原型,在 //类外定义构造函数体(即函数的实现部分) void Show( ); //在屏幕坐标(x,y)处显示一个点, //在类内仅说明了该成员函数的原型 void Hide( ); //隐藏当前(x,y)处的点 Boolean IsVisible( ) //取得Visible的值,以确定图形的可见性 { return Visible;} //返回输出目标的可见性 };
3.2.2 说明数据成员
定义Point类的框架进一步具体化为:
class Point : public Location { ∥以下说明数据成员 Protected : Boolean Visible; ∥以下说明成员函数 ┇ };
3.2.2 说明数据成员
在说明数据成员时,首先要用访问权符
指定数据的可访问性,接下来应该用数据类 型名表明当前说明的数据的数据类型,随后 写出所说明的数据的名字,最后用分号“;” 结 束对一个数据的说明。
例如:int Location :: GetX() { return X; }
3.2.3 说明和定义成员函数
⒊构造函数
给变量设置初始值的操作,通常称为初始化。 为了方便初始化工作,C++ 语言提供了一类特殊的成员函数,为 构造函数。当创建一个对象时(例如,说明类的一个实例时),系统 自动调用构造函数完成初始化工作。 为了使编译程序能够很容易地判断出哪些成员函数是构造函数, C++ 语言有下述规定:
3.2.4 完整的C++ 程序
class Arc : Public Circle //定义Arc类(从Circle类公有派生) { private : int StartAngle; int EndAngle; public : Arc(int InitX, int InitY, int InitRadius, int InitStartAngle, int InitEndAngle); //说明了弧的构造函数的原型 void Show(); //以屏幕坐标(x,y)为圆心,Radius为半径 //StartAngle为起始角,EndAngle为终止角 //显示一个弧 void Hide(); //隐藏当前的弧 int GetStartAngle(){ return StartAngle;} //获得起始角StartAngle的值 int GetEndAngle(){ return EndAngle;} //获得终止角EndAngle的值 };
3.2.4 完整的C++ 程序
class Circle : Public Point //定义Circle类(从Point类公有派生) { protected : int Radius; //定义圆半径Radius public : Circle (int InitX, int InitY, int InitRadius); //说明了圆的构造函 //数的原型 void Show( ); //以屏幕坐标(x,y)为圆心,Radius为半径 //显示一个圆 void Hide( ); //隐藏当前的圆 int GetRadius( ){ return Radius; } //获得圆半径Radius的值 };
例如,定义从“位置”类派生出的“点”类的框架如下: class Point :public Location { ∥以下说明数据成员 ┇ ∥以下说明成员函数 ┇ };
3.2.1 定义类与派生类
⒊ 访问权修饰符影响从父类继承来的成员(包括
数据成员和成员函数)在子类中的可访问性。本例
中访问权修饰符为Public(公有派生),它的含义
位置 坐标
点 可见性 +显示() +隐藏()
圆 半径 +显示() +隐藏()
弧 起始角度 结束角度 +显示() +隐藏()
图3.2简单图形程序的对象模型
3.1.3 面向对象设计
⒉定义属性 所谓定义属性就是要确定每个属性的数据类型 和数据结构,同时还要确定每个属性的访问权限 (通常被定义在保护部分或私有部分)。 ⒊定义服务 实现“显示”服务的算法概括来说就是,把 “可见 性”属性设置为true,然后调用相应的库函数用当 前 的前景颜色画出所要的图形。
3.2.4 完整的C++ 程序
综上所述,我们写出下面这个DOS环境中运行的完整的面向对象的C++图形程序:
//请读者注意,以下程序片段是在Turbo C++ 3.0或Borland C++ 3.1下运行的
#inclnde<graphics.h> #inclnde<conio.h> enum Boolean{false, true}; class Location { protected : int X; int Y; public : Location(int InitX, int InitY) { X = InitX; Y = InitY; } int GetX( ){ return x; } int GetY( ){ return y; } }; //定义枚举类型Boolean //定义基类Location //定义圆心坐标x //在类内定义构造函数 //通过构造函数的形参初始化圆心坐标x的值