第八章 类和对象(3)

合集下载

软件工程 第八章 面向对象的设计方法

软件工程 第八章 面向对象的设计方法

第八章面向对象的设计方法本章采用基于UML的面向对象设计方法的将分析模型转换为设计模型。

如第五章所述,面向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成;设计模型则包含以包图表示的软件体系结构图、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。

为完成这一转换过程,设计人员必须处理以下任务:(1)针对分析模型中的用例,设计实现方案。

实现方案用UML交互图表示。

(2)设计技术支撑设施。

在大型软件项目中,往往需要一些技术支撑设施来帮助业务需求层面的类或子系统完成其功能。

这些设施本身并非业务需求的一部分,但却为多种业务需求的实现提供公共服务。

例如,数据的持久存储服务、安全控制服务和远程访问服务等。

在面向对象设计中,需要研究这些技术支撑设施的实现方式以及它们与业务需求层面的类及子系统之间的关系。

(3)设计用户界面。

(4)针对分析模型中的领域概念模型以及第(2)、(3)两个步骤引进的新类,完整、精确地确定每个类的属性和操作,并完整地标示类之间的关系。

此外,为了实现软件重用和强内聚、松耦合等软件设计原则,还可以对前面形成的类图进行各种微调,最终形成足以构成面向对象程序设计的基础和依据的详尽类图。

面向对象的软件设计过程如图8-1-1所示。

图8-1-1 面向对象的软件设计过程第一节设计用例实现方案UML 的交互图(顺序图、协作图)适于用例实现方案的表示。

因此,本节首先介绍交互图的语言机制,然后探讨用例实现方案的设计方法。

该设计方法包含如下3个步骤:(1)提取边界类、实体类和控制类;(2)构造交互图;(3)根据交互图精华类图。

一、顺序图顺序图用来描述对象之间动态的交互关系,着重表现对象间消息传递的时间顺序。

在顺序图中,参与交互的对象位于顶端的水平轴上,垂直轴表示时间,时间推移的方向是自上而下的。

顺序图中的对象一般以“对象名:类名”的方式标识,但也可以仅采用缩写形式“对象名”或者“:类名”。

《类与对象》课后习题(含答案)

《类与对象》课后习题(含答案)

问题一:程序执行结果是
问题二:本程序中,y、z 是 class Test{ public: static int Data; }; int Test::Data=100; //A void main(void) { Test t1,t2; t1.Data=200; t2.Data=300; //B //C
2、写出程序的输出结果。 #include <iostream> #include <cstring> using namespace std; class SomeClass { int One , Two; public: SomeClass(int a = 1, int b = 1) { One = a; Two = b; cout << "Structor" << endl; } SomeClass(SomeClass &obj) { { cout<<NumA<<'\t'<<"is Destructor."<<endl; } }; int main() { MyTestClass Myclass1(5), Myclass2.Print(); return 0; } 程序的运行结果为: Myclass2(Myclass1);
,第二行是
A.show( ); } 15 10 三、程序填空题
B.show( );
1、完成如下的类,在横线中填写合适的内容。 #include <iostream> #include <cstring> using namespace std; enum Esex{mid , man , woman};//枚举请自学 2.7 class Person { int Num; //编号 char Name[12]; //姓名 Esex Sex; //性别 float Weight; //体重 public: Person(int , char * , Esex , float); Person(); ~Person() {} void PrintInfo(); int Workdays(); }; Person::Person( { Num = id; int id ,char *name , Esex s , float w)

C++学习资料

C++学习资料

课程内容第一章C++语言概述第二章基本数据类型和表达式第三章C++程序的流程控制第四章数组第五章C++函数第六章指针、引用和动态空间管理第七章结构和联合第八章类与对象第九章C++流第一章C++语言概述1.1C++语言的简史1.1.1 C语言1972年贝尔实验室C语言特点➢优点:高效、灵活、功能丰富、表达力强、一致性好➢局限性:●类型检查机制相对较弱,程序中的错误不能再编译时发现;●不支持代码重用。

1.1.2 C++语言20世纪80年代贝尔实验室C++是C语言的扩充,主要的扩充功能:●支持数据抽象●支持面向对象的设计及编程●改进了C语言中的若干不足之处1.2简单C++程序例1#include<iostream.h> //预处理命令,头文件void main() //主函数{int a,b; //定义变量cout<<”Enter two integer.”; //在标准输出设备上输出cin>>a>>b; //从标准输入设备上输入int result;result<<”\n The sum of”<<a<<”+”<<b<<”=”<<result<<endl;}字母区分大小写1.2.1注释:/*传统的C语言注释方法,注释内容可以再多行。

*///C++新增的注释方法,注释内容从//开始,到行末结束。

1.2.2 包含文件及头文件将其他文件中的源程序插入当前文件的#include语句位置中。

被包含文件一般称为头文件。

头文件扩展名一般为.h。

#include<文件名>头文件在编译系统的INCLUDE目录中查找。

#include”文件名”头文件现在当先目录查找,而后再在编译系统的INCLUDE目录中查找。

1.2.3 标准输入与输出在iostream.h中定义有两个对象:标准输入对象cin,用于从标准输入设备读入数据(一般指键盘)。

C++_3_类与对象

C++_3_类与对象

第三章类与对象§3—1 面向对象§3—2 类的定义§3—3 对象的定义§3—4 对象的初始化§3—5 特殊类§3—6 特殊对象§3—7 特殊成员§3—8复杂对象§3—9 类类型转换§3—10 友元§3—1 面向对象一.面向对象面向对象本质上是一种自然合理的思维方法,是一种通过模仿人类建立现实世界模型的习惯思维方式和表达方式,运用对象、类、封装、继承、消息、多态性等概念来构造系统的软件开发方法,它包含面向对象的分析、设计、编程、测试和维护等过程。

它从研究的客观事物出发,将它们抽象为系统中的对象,作为构成系统的基本单位,并尽可能隐蔽对象的内部细节,再把具有相同属性和服务的对象抽象为类。

从客观事物出发,经过不同层次上的抽象得到基类和它的派生类,派生类继承基类的属性和服务,实现了共享。

类中的大多数数据只能用本类的方法进行处理,类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。

向不同对象发送同一消息,可产生不同的行为二.面向对象的三大特性1.封装性:是基础是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐藏对象的内部细节,只保留有限的对外接口使之与外部发生联系,其目的是有效地实现信息隐藏,它是软件设计模块化、软件复用、软件维护的基础对象和类是封装性的体现。

类是对若干对象的抽象描述,对象是它所属类的实例对象:是用来描述客观事物的一个实体,是问题域中客观事物的抽象表示,是用来构成系统的基本单位,由一组属性和行为构成对象属性:表示客观事物的静态特性,一般用数据表达对象行为:描述客观事物的动态特性,即事物的行为,一般用函数(方法)来表达类:是一种用户自定义的抽象数据类型,包含属性和服务两部分,它为该类的所有对象提供一种统一的抽象描述2.继承性:是关键派生类继承基类的属性和服务,派生类自身还有新的属性和服务继承机制既可避免公用代码的重复开发,减少代码和数据冗余,又可通过增强一致性来减少模块间的接口和界面继承有单继承和多继承,继承有传递性3.多态性:是补充即同一接口,多种方法;相同界面,多种实现指同一个名字对应着多种不同的行为或实现或不同对象收到相同的消息时,产生不同的行为多态性有两种:编译时的多态性:重载,包括函数和运算符重载运行时的多态性:动态联编,即同一属性或行为在基类及其各个派生类中具有不同的语义多态性使高层代码只写一次而在低层可多次复用,提高了程序设计的灵活性和效率三、基本术语1.抽象对一类具体事物共性的描述,即从一类事物中抽取共同的本质特点成为概念2.消息即成员函数的调用是向对象发出的服务请求,它包含提供服务的对象标识、服务标识以及输入信息和回答信息消息的接收者是提供服务的对象,它对外提供的每一种服务是按消息格式规定好的消息协议,该消息协议就是其服务的具体功能,即通过函数体来实现的一条完整的消息包含如下内容:①消息的接收者:对象标识②服务标识:函数名③符合消息协议要求的参数:函数实参表§3—2 类的定义一、类面向对象程序设计=对象+对象+对象对象=算法+数据结构类:是对某一类对象的抽象,它由概括了一组对象共同性质的数据和函数组成是一种用户自定义的抽象数据类型,它具有对数据的抽象性、隐藏性和封装性对象:是某一个类的实例,是对现实世界中真实对象的模拟现实世界是一个对象的世界,任何对象都具有一定的属性和操作,总能用数据结构与算法两者合一地来描述二、类的定义1.类的定义(1)说明部分用于类中成员作说明,告诉使用者“干什么”:①数据成员说明:对象的属性、状态、特征②成员函数说明:对象的行为、操作、服务、方法(2)实现部分用来实现成员函数,告诉使用者“怎么干”即提供成员函数的函数体2.具体定义格式:class 类名{public:成员函数和数据成员的说明或实现protected:成员函数和数据成员的说明或实现private:数据成员和成员函数的说明或实现};各个成员函数的实现说明:(1)类名:用户自定义的标识符,应有一定英文含义,类名本身就是类型名(2)类体:“{ }”括起来的部分,凡在其中实现的成员函数均为内联函数(3)访问权限修饰符:①public:公有访问属性,这种成员可以被任意函数访问(使用),提供类的接口功能②protected:保护访问属性,这种成员只能被本类的成员函数和友元函数以及派生类中的成员函数和友元函数访问(使用)③private:私有访问属性,这种成员只能被本类的成员函数和友元函数访问(使用)(4)当把私有成员的声明放于类体最前时,private可省略,即缺省(默认)访问权限为private(5)三种访问权限符在类体中的出现顺序可任意,也可出现多次或不出现(6)在类体中不允许对声明的数据成员进行初始化(7)在定义类的成员函数时,也可对形参设置默认值。

3-类与对象的基本概念

3-类与对象的基本概念
• – 例: Student1. java、StudentTest1. java
一.类与对象
• 在一些情况中程序采用的是直接访问Student类对象成
员变量的策略。代码片段如下: s2.grade = 90; s2.age = 23; – 从表面上看,程序一切正常。如果有下面的代码片段 ,很快就会发现这不是一种好的设计方法。 s2.grade = -50; // 分数为负? s2.age = -5; // 年龄为负? – 显然,学生成绩和年龄为负数是不符常理的。由于用 户能直接访问对象的数据,所以无法限制其它应用程 序在调用这些变量时,赋予其数值的范围。
• – 例:Student1. java
一.类与对象
类的成员变量声明的格式如下: 修饰符] 初始值]; [修饰符] 类型 变量 [= 初始值]; • 说明: – 修饰符如public、private 为访问控制符。public即 公有的,也就是它可以被其他任何对象访问。 private即私有的,只能被这个类本身访问,在类外 不可见。 – 修饰符static指明这是一个类变量(静态成员变量或 静态变量)。
二.对象初始化
前面的例子,每创建一个Student对象都要调用一系列 set方法来初始化类中的实例变量,这实在太繁琐。因此 ,在创建对象的同时就对对象进行初始化是一种简单而 有效的解决方法。 • Java中有一种特殊的方法叫构造方法(Constructor),即 产生对象时需要调用的方法。 • 构造方法的形式如下: public 类名 参数列表 { 类名(参数列表 参数列表) 语句体 }
– 例: Leaf. Ja练习 – 定义一个名为Dog的类,具有方法bark(),此方法应 根据不同的基本数据类型进行重载,并根据被调用的 版本,打印出不同类型的狗吠(baying)、嚎叫 (howling)等消息。编写main()方法来测试。

对象和类的区别与联系

对象和类的区别与联系

对象和类的区别与联系在面向对象编程(Object-oriented programming, OOP)中,对象和类是两个重要的概念。

它们之间既有区别,又有联系。

本文将从几个方面来探讨对象和类的区别与联系。

一、定义和特点对象是类的实例化结果,是类的具体表现。

它具有状态(属性)和行为(方法),可以进行数据的存储和处理。

对象可以是实物,如一辆汽车;也可以是抽象的,如一个人。

每个对象都有特定的属性和行为,但属性值可以在不同的对象之间有所变化。

类是对象的抽象描述,是具有相同属性和行为的一组对象的集合。

类定义了对象的共同特征和行为模式。

它包含了对象的属性和方法的声明,但不包含具体的数据。

类是创建对象的模板,在类的基础上可以创建多个对象。

二、关系1. 单向关系:类和对象之间是单向的关系,类可以创建对象,对象则不能创建类。

2. 多对多关系:一个类可以创建多个对象,多个对象可以属于同一个类。

3. 继承关系:类可以通过继承关系来派生子类,子类可以继承父类的属性和方法,并可以扩展和重写父类的功能。

三、区别1. 定义方式:对象是通过类的构造函数来创建的,使用“new”关键字可以实例化一个对象;而类是通过class关键字来定义的,使用类名可以创建多个对象。

2. 范围:对象是类的实例,是类的子集;而类是对象的模板,在类的基础上可以创建多个对象。

3. 数据共享:同一个类的多个对象之间可以共享类的静态属性和方法;而对象的非静态属性和方法是各自独立的。

4. 属性和方法的调用:对象通过“对象名.属性名”或“对象名.方法名(参数)”的方式来调用自身的属性和方法;而类是通过“类名.属性名”或“类名.方法名(参数)”的方式来调用类的属性和方法。

四、联系对象和类是紧密相关的,它们之间有如下联系:1. 对象的创建依赖于类,类提供了对象的模板和行为规范。

2. 对象是类的实例,类描述了对象所具有的属性和方法。

3. 类可以通过创建多个对象来实现代码的复用和灵活性。

第8章 面向对象分析-软件工程基础(第3版)-胡思康-清华大学出版社

第8章  面向对象分析-软件工程基础(第3版)-胡思康-清华大学出版社

第8章 面向对象分析
第 5 页5
面向对象分析概述
面向对象分析的3类模型
OOA模型由3类独立模型构成:功能模型、静态模型和动态模型。 ➢功能模型描述软件系统的用户交互和功能。 ➢静态模型描述软件系统中类与对象以及它们间的关系,也因也称 为对象模型。 ➢动态模型描述系统的控制结构,也称为交互模型。
第8章 面向对象分析
第 6 页6
面向对象分析概述

静态模型的5个层次 类-对象层
对象
Coad和Yourdon 提出,对于大型、复杂 性软件系统,需要建立 分析问题域的静态模型。 该模型由5个层次组成: 类-对象层、结构层、 属性层、服务层和主题 层。
结构层 属性层 服务层 主题层
泛化关系
关联关系
属性
对象连接
服务
消息连接
⑶ 用例描述:用文字信息详细描述用例的内容,它是对用 例的有益补充。
第8章 面向对象分析
第 8 页8
建立静态模型
➢用例模型分别从参与者和系统的角度描述用户需求, 依据用例模型导出静态模型。静态模型是面向对象建 模中最基本、最重要、最耗时的技术活动。 ➢静态建模的任务是构建问题域的概念模型,把问题 域中的实体转变为信息域的类与对象以及它们间的关 系,因此也被称为对象模型或领域模型。 ➢静态模型通过建立类图及关系来反映领域概念,而 面向对象设计也建立类图,但各阶段对类的抽象程度 不同。
第8章 面向对象分析
第 12 页12
建立动态模型
建立状态图
状态图描述的就是对象状态的转换过程。通过对对象状态 的分析,能够了解对象在系统流程中的变换,从而发现潜在的事 件和条件。
建立状态图的一般过程如下: ⑴ 了解系统的主要功能和性能,确定和它们有关的主要对象。 ⑵ 列出一个对象的生存期内的所有可能的状态。 ⑶ 确定对象状态改变时的触发条件或事件。 ⑷ 在一个对象中,选定一组与描述状态相关的行为属性和促使 改变状态的方法。 ⑸ 结合触发条件、事件、行为属性值改变的先后顺序,建立软 件系统的状态图。

第八章 类和对象 复习题知识讲解

第八章  类和对象  复习题知识讲解

第八章类和对象复习题第八章类和对象复习题1.系统为每个类提供一个this指针,在类的成员函数内,通过this指针可以间接访问这个类的( )所有成员C.友元类的public成员D.所有派生类中的public成员2.如果在class类的定义中既不指定private,也不指定public,则系统就默认为( )A. privateB. publicC. protectedD. 不确定3. 对静态数据成员的描述, 正确的是( )A. 静态数据成员可以在类体内进行初始化B. 静态数据成员不可以被类的对象调用C. 静态数据成员不能受private控制符的作用D. 静态数据成员可以直接用类名调用4. 下面叙述错误的是( )A. 基类的protected成员在派生类中仍然是protected的B. 基类的protected成员在public派生类中仍然是protected的C. 基类的protected成员在private派生类中是private的D. 基类的protected成员不能被派生类的对象访问5.对于友元函数的描述,正确的是( )A. 友元函数的实现必须在类的内部定义B. 友元函数是类的成员函数C. 友元函数破坏了类的封装性和隐藏性D. 友元函数不能访问类的私有成员6.关于内联函数的描述,正确的是( )A.使用内联函数可以缩短程序代码,减少占用的内存空间B.使用内联函数可以减少函数调用时入栈和出栈的时间和空间开销,但是会使程序的代码量增加C.内联函数只能在类的内部进行声明和定义,不能作为全局函数D.内联函数可以做虚函数7. 类是对象的( )A. 具体B. 抽象C. 封装D. 多态8. struct声明类时,若不作private或public声明,系统默认为( )A. privateB. publicC. protectedD. 不能确定9.引入内联函数的主要目的是( )A.缩短程序代码,少占用内存空间B.既可以保证程序的可读性,又能提高程序的运行效率C.占用内存空间少,执行速度快D.使程序的结构比较清晰10. 类的具体表现是通过定义来操作的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

void set_time(Time& t, int hour, int minute, int sec) { t.hour=hour; t.minute=minute; t.sec=sec; } void show_time(Time& t) { cout<<t.hour<<“:”<<t.minute<<“:”<<t.sec<<endl; } 程序运行时的输出为 12:23:34 (t1中的时、分、秒) 中的时、 中的时 0:0:0 (t2中的时、分、秒) 中的时、 中的时
int main( ) { void set_time(Time&); //函数声明 void show_time(Time&); //函数声明 Time t1; //定义t1为Time类对象 set_time(t1); //调用set_time函数,向t1对象中的数据成 函数,
员输入数据
show_time(t1); //调用show_time函数,输出t1对象中的 函数,
运行情况如下: 12 32 43↙ 12:32:43
注意: (1) 在引用数据成员hour,minute,sec 时不要忘记在前面 指定对象名。 (2) 不要错写为类名,如写成 Time.hour, Time.minute, Time.sec 是不对的。因为类是一种抽象的数据类型,并不是 一个实体,也不占存储空间,而对象是实际存在的实体, 是占存储空间的,其数据成员是有值的,可以被引用的。 (3) 如果删去主函数的3个输入语句,即不向这些数据成员 赋值,则它们的值是不可预知的。
int Hour,Minute,Second; };
Implementation File
//Begin of the sourse file clock.cpp #include “clock.h” #include<iostream.h> //the complementation of member functions void Clock::SetTime(int NewH, int NewM, int NewS) { Hour=NewH; Minute=NewM; Second=NewS; } void Clock::ShowTime() { cout<<Hour<<":"<<Minute<<":"<<Second<<endl; }
( Method 2 )
The specification file
//Begin of the sourse file clock.h class Clock { public: //public interface void SetTime(int NewH=0, int NewM=0, int NewS=0); void ShowTime(); private: //private data //declaration
Example:( Method 1 )
//main function void main( ) { Clock myClock; //define myClock
cout<<"First time set and output:"<<endl; myClock.SetTime();//set time with defaultvalue myClock.ShowTime(); //show time cout<<"Second time set and output:"<<endl; myClock.SetTime(8,30,30);//set time with 8:30:30 myClock.ShowTime(); //show time }
(3) 程序(c) 可以对上面的程序作一些修改,数据成员的值不再由键盘 输入,而在调用函数时由实参给出,并在函数中使用默认 参数。将程序(b)第8行以下部分改为
int main( ) { void set_time(Time&, int hour=0, int minute=0, int sec=0); void show_time(Time&); Time t1; 通过实参传递时、 set_time(t1,12,23,34);//通过实参传递时、分、秒的值 show_time(t1); Time t2; set_time(t2); //使用默认的时、分、秒的值 使用默认的时、 show_time(t2); return 0; }
//student.cpp //在此文件中进行函数的定义 #include <iostream> #include “student.h”//不要漏写此行,否则编译通不过 不要漏写此行, void Student::display( )//在类外定义display类函数 { cout<<“num:”<<num<<endl; cout<<“name:”<<name<<endl; cout<<“sex:”<<sex<<endl; } 一个完整的源程序,还应包括主函数的源文件: 一个完整的源程序,还应包括主函数的源文件: //main.cpp 主函数模块 #include <iostream> #include ″student.h″ //将类声明头文件包含进来 int main( ) { Student stud; //定义对象 stud.display( ); //执行stud对象的display函数 return 0; }
引用多个对象的成员。 例: 引用多个对象的成员。 程序( (1) 程序(a) #include <iostream> using namespace std; class Time { public: int hour; int minute; int sec; };
int main( ) { Time t1; //定义对象t1 cin>>t1.hour; //向t1的数据成员输入数据 cin>>t1.minute; cin>>t1.sec; cout<<t1.hour<<“:”<<t1.minute<<“:”<<t1.sec<<endl; Time t2; //定义对象t2 cin>>t2.hour; //向t2的数据成员输入数据 cin>>t2.minute; cin>>t2.sec; cout<<t2.hour<<“:”<<t2.minute<<“:”<<t2.sec<<endl; return 0; }
上机演示
5.3 面向对象程序设计中的几个名词
类的成员函数在面向对象程序理论中被称为“方 法”(method),“方法”是指对数据的操作。一个“方法” 对应一种操作。显然,只有被声明为公用的方法(成员函 数)才能被对象外界所激活。 外界是通过发“消息”来激活有关方法的。所谓“消 息”,其实就是一个命令,由程序语句来实现。 stud.display( ); 就是向对象stud 发出的一个“消息”,通知 它执行其中的display“方法”(即display函数)。 上面这个语句涉及3个术语: 对象、方法和消息。stud 是对象,display( )是方法,语句“stud.display( );”是消息。
5 类的封装性和信பைடு நூலகம்隐蔽
5.1 公用接口与私有实现的分离
类中被操作的数据是私有的,实现的细节对用户是隐蔽 的,这种实现称为私有实现(private implementation)。这种 “类的公用接口与私有实现的分离”形成了信息隐蔽。 软件工程的一个最基本的原则就是将接口与实现分离, 信息隐蔽是软件工程中一个非常重要的概念。它的好处在 于: (1) 如果想修改或扩充类的功能,只需修改本类中有关的 数据成员和与它有关的成员函数,程序中类外的部分可以 不必修改。 (2) 如果在编译时发现类中的数据读写有错,不必检查整 个程序,只需检查本类中访问这些数据的少数成员函数。
6 类和对象的简单应用举例
例: 最简单的例子。 最简单的例子。
#include <iostream> using namespace std; class Time //定义Time类 { public: //数据成员为公用的 int hour; int minute; int sec; }; int main( ) { Time t1; //定义t1为Time类对象 cin>>t1.hour; //输入设定的时间 cin>>t1.minute; cin>>t1.sec; cout<<t1.hour<<“:”<<t1.minute<<“:”<<t1.sec<<endl; return 0; }
数据
Time t2; //定义t2为Time类对象 set_time(t2); //调用set_time函数,向t2对象中的数据成 函数,
员输入数据
show_time(t2); //调用show_time函数,输出t2对象中的 函数,
数据
return 0; }
void set_time(Time& t) //定义函数set_time,形参t是引用变量 { cin>>t.hour; //输入设定的时间 cin>>t.minute; cin>>t.sec; } void show_time(Time& t) //定义函数show_time,形参t是引用变量 { cout<<t.hour<<″:″<<t.minute<<″:″<<t.sec<<endl; }
相关文档
最新文档