1、第2章 程序设计基础,知识类型:理论 学时:4学时,面向对象的语言,出发点: 更直接地描述客观世界中存在的事物(对象)以及它们之间的关系。 特点: 是高级语言。 将客观事物看作具有属性和行为的对象。 通过抽象找出同一类对象的共同属性和行为,形成类。 通过类的继承与多态实现代码重用,优点: 使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。,面向对象的语言,程序设计方法的发展历程 面向过程的程序设计方法,程序的目的:用于数学计算 主要工作:设计求解问题的过程 缺点:对于庞大、复杂的程序难以开发和维护,程序设计方法的发展历程 面向过程的结构
2、化程序设计方法,设计思路 自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。 程序结构: 按功能划分为若干个基本模块,形成一个树状结构。 各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。 其模块化实现的具体方法是使用子程序。,程序设计方法的发展历程 面向过程的结构化程序设计方法,优点: 有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。,程序设计方法的发展历程 面向过程的结构化程序设计方法,缺点:可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件 把数据和处理数据的过程分离为相互独立的实
3、体。 当数据结构改变时,所有相关的处理过程都要进行相应的修改。 每一种相对于老问题的新方法都要带来额外的开销。 图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。,程序设计方法的发展历程 面向对象的方法,将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体对象。 对同类型对象抽象出其共性,形成类。 类通过一个简单的外部接口,与外界发生关系。 对象与对象之间通过消息进行通讯。,程序设计方法的发展历程 面向对象的方法,优点: 程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和
4、维护都更为方便。,面向对象的基本概念 对象,一般意义上的对象: 是现实世界中一个实际存在的事物。 可以是有形的(比如一辆汽车),也可以是无形的(比如一项计划)。,对象有如下特性:有一个名字以区别于其它对象:有一个状态用来描述它的某些特征:有一组操作,每个操作决定了对象的一种功能或行为:对象的操作分为两类:自身承受的操作、施加于其它对象的操作,是构成世界的一个独立单位,具有: 静态特征:可以用某种数据来描述 动态特征:对象所表现的行为或具有的功能, 有一个人名字叫胡哥,性别男,身高1.80m,体重68kg,可以修电器,可以教计算机课,描述该对象如下: 对象的静态特征: 性别:男 身高:1.80m
5、 体重:68kg 对象的动态特征: 回答身高 回答体重 回答性别 修理电器 教计算机课,面向对象的基本概念 对象,面向对象方法中的对象: 是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。 属性:用来描述对象静态特征的数据项。 行为:用来描述对象动态特征的操作序列。,面向对象的基本概念 类,分类人类通常的思维方法 分类所依据的原则抽象 忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。 例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念。,面向
6、对象的基本概念 类,面向对象方法中的“类“ 具有相同属性和行为的一组对象的集合 为属于该类的全部对象提供了抽象的描述,包括属性和行为两个主要部分。 类与对象的关系: 犹如模具与铸件之间的关系,一个属于某类的对象称为该类的一个实例。,抽象,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。 先注意问题的本质及描述,其次是实现过程或细节。 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。 代码抽象:描述某类对象的共有的行为特征或具有的功能。 抽象的实现:通过类的声明。,抽象实例钟表,数据抽象: int Hour, int Minute, int Second
7、代码抽象: 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() ,类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对
8、象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。 利用类可以实现数据的封装、隐藏、继承与派生。,c+中的类,类 和 对 象,类的声明形式,类是一种用户自定义类型,声明形式:,class 类名称 public:公有成员(外部接口)private:私有成员protected:保护型成员 ,类 和 对 象,类的成员,class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime();private: int Hour, Minute, Second; ;,成员数据,成员函数,类 和 对 象,void
9、 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,类 和 对 象,类 和 对 象,成员函数,在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。 允许声明重载函数和带默认形参值的函数,成员数据,与一般的变量声明相同,但需要将它放在类的声明体中。,对象,类的对象是该类的某一特定实体,即类
10、类型的变量。 声明形式: 类名 对象名; 例: Clock myClock;,类 和 对 象,类中成员的访问方式,类中成员互访 直接使用成员名 类外访问 使用“对象名.成员名”方式访问 public 属性的成员,类 和 对 象,类的应用举例,#include class Clock /类的声明略 /类的实现略 int main() Clock myClock;myClock.SetTime(8,30,30);myClock.ShowTime(); ,类 和 对 象,面向对象的基本概念 封装,将抽象出的数据成员、代码成员相结合,将它们视为一个整体。 目的是曾强安全性和简化编程,使用者不必了解具体
11、的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。 实现封装:类声明中的 ,封装实例: class Clock public: void SetTime(int NewH,int NewM, int NewS); void ShowTime();private: int Hour,Minute,Second; ;,特定的访问权限,面向对象的基本概念 继承与派生,继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。 定义:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。 例如:将轮船作为一个一般类,客轮便是一个特殊类。,保持已有类
12、的特性而构造新类的过程称为继承。 在已有类的基础上新增自己的特性而产生新类的过程称为派生。 被继承的已有类称为基类(或父类)。 派生出的新类称为派生类。,继承与派生问题举例,继承与派生问题举例,继承与派生问题举例,继承与派生问题举例,多继承、单继承,继承与派生的目的,继承的目的:实现代码重用。 派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。,派生类的声明,class 派生类名:继承方式 基类名 成员声明; ,Public: Protected: Private:,继承方式:,公有继承举例,class Point /基类Point类的声明 public
13、: /公有函数成员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坐标值,Point类:,静态特征: x,y,class Rectangle: public Point /派生类声明 pu
14、blic: /新增公有函数成员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; ;,39,动态特征: InitR(x,y,w,h)初始化 GetH()得到矩形的高 GetW()得到矩形的宽,Rectanglet类:,静态特征: W,H,Move(x,y)移动该点 GetX()得到该点X坐标值 GetY()得到该点Y坐标值,Point类:,#inclu
15、de #include 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,面向对象的基本概念 多态性,多态是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义。 例如: 数的加法-实数的加法 -复数的加法,多态:同一名称,不
16、同的功能实现方式。 目的:达到行为标识统一,减少程序中标识符的个数。 实现:重载函数和虚函数,总结,面向对象程序设计(英语:Object Oriented Programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。,类,类(Class)定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的(它的行为)。 类可以为程序提供模版和结构。 一个类的方法和属性被称为“成员”。,类狗 私有成员: 体重毛皮颜色 .公有成员: 吠叫(). ,对象,对象(Object)是类的实例
17、。类狗 莱丝;莱丝.毛皮颜色=棕白色 莱丝.吠叫();,我们无法让狗这个类去吠叫,但是我们可以让对象“莱丝“去吠叫,正如狗可以吠叫,但没有具体的狗就无法吠叫。,方法(行为),方法(Method)是一个类能做的事情,但方法并没有去做这件事。 作为一条狗,莱丝是会吠叫的,因此“吠叫()”就是它的一个方法。与此同时,它可能还会有其它方法,例如“坐下()”,或者“吃()”。 对一个具体对象的方法进行调用并不影响其它对象,正如所有的狗都会叫,但是你让一条狗叫不代表所有的狗都叫。 类狗 莱丝,泰尔;莱丝.吠叫();则泰尔是不会吠叫的,因为这里的吠叫只是对对象“莱丝“进行的。,封装性,具备封装性(Encap
18、sulation)的面向对象程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。/* 一个面向过程的程序会这样写: */ 结构体狗 莱丝 ;设置音调(莱丝,5);吸气(莱丝) ;吐气(莱丝) ;/* 当狗的吠叫被封装到类中,任何人都可以简单地使用: */ 类狗 莱丝;莱丝.吠叫() ;,封装是通过限制只有特定类的实例可以访问这一特定类的成员,而它们通常利用接口实现消息的传入传出。,class MeiNu /美女类! private:int XW; /胸围int YW; /我就不说了噢 :)int TW; /我还是不说了噢 :);,MeiNu jordan; /now
19、 is 乔丹! jordan.XW = 34; jordan.YW = 24; jordan.TW = 34;,继承性与多态性,继承性(Inheritance)是指,在某种情况下,一个类会有“子类”。 多态性(Polymorphism)指方法在不同的类中调用可以实现的不同结果。,类狗 莱丝; 类鸡 鲁斯特; 莱丝.叫(); 鲁斯特.叫();,鸡啼 犬吠,消息,消息是系统向对象发出的服务请求,是对象之间的通信机制。提供服务的对象负责消息协议的格式和消息的接收,请求服务的对象提供输入信息,获取应答消息内容。 在面向对象中,消息常常通过函数调用来实现。,状态:胡哥29岁男计算机讲师680,实例:,行
20、为:评职称涨工资,抽象,属性:姓名年龄性别单位职称工资,类:讲师,操作:评职称涨工资,数据 结构,方法名,方法:评职称步骤条件涨工资公式,方法体,class 讲师 胡哥;,胡哥.评职称(.);,胡哥.调工资(.);,消息,补充习题-选择题,1. 下面描述中,符合结构化程序设计风格的是_。 A. 使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑 B. 模块只有一个入口,可以有多个出口 C. 注重提高程序的执行效率 D. 不使用goto语句 2. 下面概念中,不属于面向对象方法的是_。 A. 对象 B. 继承 C. 类 D. 过程调用 3. 结构化程序设计主要强调的是_。 A. 程序
21、的规模 B. 程序的易读性 C. 程序的执行效率 D. 程序的可移植性 4. 对建立良好的程序设计风格,下面描述正确的是_。 A. 程序应简单、清晰、可读性好 B. 符号名的命名要符合语法 C. 充分考虑程序的执行效率 D. 程序的注释可有可无,补充习题-选择题,5. 下面对对象概念描述错误的是_。A. 任何对象都必须有继承性 B. 对象是属性和方法的封装体 C. 对象间的通讯靠消息传递 D. 操作是对象的动态性属性 6. 算法一般都可以用哪几种控制结构组合而成_。 A. 循环、分支、递归 B. 顺序、循环、嵌套 C. 循环、递归、选择 D. 顺序、选择、循环 7. 在面向对象方法中,一个对象
22、请求另一对象为其服务的方式是通过发送_。 A. 调用语句 B. 命令 C. 口令 D. 消息,补充习题-选择题,8. 在设计程序时,应采纳的原则之一是_。A. 程序结构应有助于读者理解 B. 不限制goto语句的使用 C. 减少或取消注解行 D. 程序越短越好 9. 面向对象的设计方法与传统的的面向过程的方法有本质不同,它的基本原理是_。 A. 模拟现实世界中不同事物之间的联系 B. 强调模拟现实世界中的算法而不强调概念 C. 使用现实世界的概念抽象地思考问题从而自然地解决问题 D. 鼓励开发者在软件开发的绝大部分中都用实际领域的概念去思考 10采用面向对象技术开发的应用系统的特点是_。 A
23、重用性更强B 运行速度更快C 占用存储量小D 维护更复杂,补充习题-填空题,1结构化程序设计的三种基本逻辑结构为顺序、选择和( ) 2源程序文档化要求程序应加注释。注释一般分为序言性注释和( ) 3在面向对象方法中,信息隐蔽是通过对象的( )性来实现的. 4类是一个支持集成的抽象数据类型,而对象是类的( ) 5在面向对象方法中,类之间共享属性和操作的机制称为( 6. 结构化程序设计方法的主要原则可以概括为自顶向下、逐步求精、 ( ) 和限制使用goto语句。 7. 面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个( )。 8. 一个类可以从直接或间接的祖先中继承所有属性和方法。
24、采用这个方法提高了软件的( ) 9. 面向对象的模型中,最基本的概念是对象和 ( )。 10.结构化程序设计是一种面向( )的设计方法.,补充习题-填空题,11. 对象的基本特点包括标识唯一性、分类性、 多态性、( )和模块独立性 12.采用结构化程序设计方法能够使程序易读、易理解( )和结构良好. 13.在面向对象分析和设计中,通常把对象所进行的操作称为( ) 14.使用已经存在的类定义作为基础建立新的类定义,这样的技术称为( ) 15. 继承使得相似的对象可以共享代码和数据结构,从而大大减少了程序中的冗余信息,提高软件的( ) 16. 对象和类的关系可以表示为( )和( )的关系 17.
25、重复使用一个对象类有两种方法,分别是( )和( )。,答案: 17 .创建该类的实例,从而直接使用它;从它派生出一个满足当前需要的新类,补充习题-填空题,18. 结构化程序设计的原则中, “先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标”称为( ) 。 19. 在程序设计语言中,重复结构对应两类循环语句,即先判断后执行循环体的( ) 循环结构,和先执行循环体后判断( ) 循环结构。 20. 在消息传递中,对象根据所接受的消息而做出动作,同样的消息被不同的对象接受时可导致完全不同的行动,该现象称为 ( ) 。,(06.4月)下列选项中不属于结构化程序设计方法的是A) 自顶向下 B)逐步求精 C)模块化 D)可复用2. (06.4月)在面向对象方法中,【 】描述的是具有相似属性与操作的一组对象。3. (05.4月)在面向对象方法中,类的实例称为 【 】.,有关等级考试题,