570 likes | 762 Views
第 2 章 程序设计基础. 知识类型:理论 学时: 4 学时. 面向对象的语言. 出发点: 更直接地描述客观世界中存在的事物 ( 对象 ) 以及它们之间的关系。 特点: 是高级语言。 将客观事物看作具有 属性 和 行为 的对象。 通过 抽象 找出同一类对象的共同属性和行为,形成 类 。 通过类的 继承 与 多态 实现代码重用. 面向对象的语言. 优点: 使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。. 程序设计方法的发展历程 —— 面向 过程 的程序设计方法. 程序的目的:用于数学计算
E N D
知识类型:理论 学时:4学时
面向对象的语言 • 出发点: • 更直接地描述客观世界中存在的事物(对象)以及它们之间的关系。 • 特点: • 是高级语言。 • 将客观事物看作具有属性和行为的对象。 • 通过抽象找出同一类对象的共同属性和行为,形成类。 • 通过类的继承与多态实现代码重用
面向对象的语言 • 优点: 使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。
程序设计方法的发展历程——面向过程的程序设计方法程序设计方法的发展历程——面向过程的程序设计方法 • 程序的目的:用于数学计算 • 主要工作:设计求解问题的过程 • 缺点:对于庞大、复杂的程序难以开发和维护
程序设计方法的发展历程——面向过程的结构化程序设计方法程序设计方法的发展历程——面向过程的结构化程序设计方法 • 设计思路 • 自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。 • 程序结构: • 按功能划分为若干个基本模块,形成一个树状结构。 • 各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。 • 其模块化实现的具体方法是使用子程序。
程序设计方法的发展历程——面向过程的结构化程序设计方法程序设计方法的发展历程——面向过程的结构化程序设计方法 • 优点: 有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。
程序设计方法的发展历程——面向过程的结构化程序设计方法程序设计方法的发展历程——面向过程的结构化程序设计方法 • 缺点:可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件 • 把数据和处理数据的过程分离为相互独立的实体。 • 当数据结构改变时,所有相关的处理过程都要进行相应的修改。 • 每一种相对于老问题的新方法都要带来额外的开销。 • 图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。
程序设计方法的发展历程——面向对象的方法 • 将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。 • 对同类型对象抽象出其共性,形成类。 • 类通过一个简单的外部接口,与外界发生关系。 • 对象与对象之间通过消息进行通讯。
程序设计方法的发展历程——面向对象的方法 • 优点: • 程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。 • 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。
面向对象的基本概念——对象 • 一般意义上的对象: • 是现实世界中一个实际存在的事物。 • 可以是有形的(比如一辆汽车),也可以是无形的(比如一项计划)。 • 对象有如下特性: :有一个名字以区别于其它对象 • :有一个状态用来描述它的某些特征 • :有一组操作,每个操作决定了对象的一种功能或行为 • :对象的操作分为两类:自身承受的操作、施加于其它对象的操作 • 是构成世界的一个独立单位,具有: • 静态特征:可以用某种数据来描述 • 动态特征:对象所表现的行为或具有的功能
<例> • 有一个人名字叫胡哥,性别男,身高1.80m,体重68kg,可以修电器,可以教计算机课,描述该对象如下: • 对象的静态特征: • 性别:男 • 身高:1.80m • 体重:68kg • 对象的动态特征: • 回答身高 • 回答体重 • 回答性别 • 修理电器 • 教计算机课
面向对象的基本概念——对象 • 面向对象方法中的对象: • 是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。 • 属性:用来描述对象静态特征的数据项。 • 行为:用来描述对象动态特征的操作序列。
面向对象的基本概念——类 • 分类——人类通常的思维方法 • 分类所依据的原则——抽象 • 忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。 • 例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念。
面向对象的基本概念——类 • 面向对象方法中的"类" • 具有相同属性和行为的一组对象的集合 • 为属于该类的全部对象提供了抽象的描述,包括属性和行为两个主要部分。 • 类与对象的关系:犹如模具与铸件之间的关系,一个属于某类的对象称为该类的一个实例。
抽象 抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。 • 先注意问题的本质及描述,其次是实现过程或细节。 • 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。 • 代码抽象:描述某类对象的共有的行为特征或具有的功能。 • 抽象的实现:通过类的声明。
抽象实例——钟表 • 数据抽象: int Hour, int Minute, int Second • 代码抽象: SetTime(), ShowTime()
抽象实例——钟表类 class Clock { public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; };
抽象实例——人 • 数据抽象: char *name,char *gender,int age,int id • 代码抽象: 生物属性角度:GetCloth(), Eat(), Step(),… 社会属性角度:Work(), Promote() ,…
c++中的类 类 和 对 象 • 类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。 • 利用类可以实现数据的封装、隐藏、继承与派生。
类的声明形式 类 和 对 象 • class 类名称 • { • public: • 公有成员(外部接口) • private: • 私有成员 • protected: • 保护型成员 • } 类是一种用户自定义类型,声明形式:
类的成员 类 和 对 象 成员函数 class Clock { public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour, Minute, Second; }; 成员数据
类 和 对 象 void Clock :: SetTime(int NewH, int NewM, int NewS) { Hour=NewH; Minute=NewM; Second=NewS; } void Clock :: ShowTime() { printf(“%d:%d:%d”,Hour,Minute,Second); } 19
成员数据 成员函数 类 和 对 象 • 与一般的变量声明相同,但需要将它放在类的声明体中。 • 在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。 • 允许声明重载函数和带默认形参值的函数
对象 类 和 对 象 • 类的对象是该类的某一特定实体,即类类型的变量。 • 声明形式: 类名 对象名; • 例:Clock myClock;
类中成员的访问方式 类 和 对 象 • 类中成员互访 • 直接使用成员名 • 类外访问 • 使用“对象名.成员名”方式访问public属性的成员
<例>类的应用举例 类 和 对 象 #include<iostream> class Clock { ......//类的声明略 } //......类的实现略 int main() { Clock myClock; myClock.SetTime(8,30,30); myClock.ShowTime(); }
面向对象的基本概念——封装 • 将抽象出的数据成员、代码成员相结合,将它们视为一个整体。 • 目的是曾强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。 • 实现封装:类声明中的{ }
外部接口 边界 • 封装实例: class Clock { public: void SetTime(int NewH,int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; }; 特定的访问权限
面向对象的基本概念——继承与派生 • 继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。 • 定义:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。 • 例如:将轮船作为一个一般类,客轮便是一个特殊类。
保持已有类的特性而构造新类的过程称为继承。保持已有类的特性而构造新类的过程称为继承。 • 在已有类的基础上新增自己的特性而产生新类的过程称为派生。 • 被继承的已有类称为基类(或父类)。 • 派生出的新类称为派生类。
继承与派生问题举例 多继承、单继承
继承与派生的目的 • 继承的目的:实现代码重用。 • 派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。
派生类的声明 class 派生类名:继承方式 基类名 { 成员声明; } Public: Protected: Private: 继承方式:
公有继承举例 Point类: class Point //基类Point类的声明 {public: //公有函数成员 void InitP(float xx=0, float yy=0) {X=xx;Y=yy;} void Move(float xOff, float yOff) {X+=xOff;Y+=yOff;} float GetX() {return X;} float GetY() {return Y;} private: //私有数据成员 float X,Y; }; 动态特征: InitP(x,y)初始化一个点 Move(x,y)移动该点 GetX()得到该点X坐标值 GetY()得到该点Y坐标值 静态特征: x,y
class Rectangle: public Point //派生类声明 {public: //新增公有函数成员 void InitR(float x, float y, float w, float h) {InitP(x,y);W=w;H=h;}//调用基类公有成员函数 float GetH() {return H;} float GetW() {return W;} private: //新增私有数据成员 float W,H; }; Rectanglet类: 动态特征: InitR(x,y,w,h)初始化 GetH()得到矩形的高 GetW()得到矩形的宽 Point类: Move(x,y)移动该点 GetX()得到该点X坐标值 GetY()得到该点Y坐标值 静态特征: W,H 39
#include<iostream> #include<cmath> int main() { Rectangle rect; rect.InitR(2,3,20,10); //通过派生类对象访问基类公有成员 rect.Move(3,2); printf(“%f,%f,%f,%f”,rect.GetX(), rect.GetY(), rect.GetH(), rect.GetW()); return 0; } 40
面向对象的基本概念——多态性 • 多态是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义。 • 例如: 数的加法->实数的加法->复数的加法
多态:同一名称,不同的功能实现方式。 • 目的:达到行为标识统一,减少程序中标识符的个数。 • 实现:重载函数和虚函数
总结 • 面向对象程序设计(英语:Object Oriented Programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
类 • 类(Class)定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的(它的行为)。 • 类可以为程序提供模版和结构。 • 一个类的方法和属性被称为“成员”。 类狗 { 私有成员: 体重 毛皮颜色 ......... 公有成员: 吠叫() ........... }
对象 • 对象(Object)是类的实例。 类狗 莱丝; 莱丝.毛皮颜色=棕白色 莱丝.吠叫(); 我们无法让狗这个类去吠叫,但是我们可以让对象"莱丝"去吠叫,正如狗可以吠叫,但没有具体的狗就无法吠叫。
方法(行为) • 方法(Method)是一个类能做的事情,但方法并没有去做这件事。 • 作为一条狗,莱丝是会吠叫的,因此“吠叫()”就是它的一个方法。与此同时,它可能还会有其它方法,例如“坐下()”,或者“吃()”。 对一个具体对象的方法进行调用并不影响其它对象,正如所有的狗都会叫,但是你让一条狗叫不代表所有的狗都叫。 • 类狗 莱丝,泰尔; 莱丝.吠叫(); 则泰尔是不会吠叫的,因为这里的吠叫只是对对象"莱丝"进行的。
封装性 • 具备封装性(Encapsulation)的面向对象程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。 • /* 一个面向过程的程序会这样写: */结构体狗 莱丝 ; 设置音调(莱丝,5); 吸气(莱丝) ; 吐气(莱丝) ; • /* 当狗的吠叫被封装到类中,任何人都可以简单地使用: */ 类狗 莱丝; 莱丝.吠叫() ; class MeiNu //美女类! {............ private: int XW; //胸围 int YW; //我就不说了噢 :) int TW; //我还是不说了噢 :)) }; 封装是通过限制只有特定类的实例可以访问这一特定类的成员,而它们通常利用接口实现消息的传入传出。 MeiNu jordan; //now is 乔丹! jordan.XW = 34; jordan.YW = 24; jordan.TW = 34;
继承性与多态性 • 继承性(Inheritance)是指,在某种情况下,一个类会有“子类”。 • 多态性(Polymorphism)指方法在不同的类中调用可以实现的不同结果。 类狗 莱丝; 类鸡 鲁斯特; 莱丝.叫(); 鲁斯特.叫(); 鸡啼 犬吠
消息 • 消息是系统向对象发出的服务请求,是对象之间的通信机制。提供服务的对象负责消息协议的格式和消息的接收,请求服务的对象提供输入信息,获取应答消息内容。 • 在面向对象中,消息常常通过函数调用来实现。
实例: 类:讲师 <例> 状态:胡哥 29岁 男 计算机 讲师 680 属性:姓名 年龄 性别 单位 职称 工资 数据 结构 抽象 操作:评职称 涨工资 方法名 行为:评职称 涨工资 方法:评职称 {步骤 条件} 涨工资 {公式} class 讲师 胡哥; 胡哥.评职称(.....); 方法体 消息 胡哥.调工资(.....);