华中科技大学C++课件第一章面向对象程序设计概论_第1页
华中科技大学C++课件第一章面向对象程序设计概论_第2页
华中科技大学C++课件第一章面向对象程序设计概论_第3页
华中科技大学C++课件第一章面向对象程序设计概论_第4页
华中科技大学C++课件第一章面向对象程序设计概论_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目的:崭新的二十一世纪,以现代电子信息产业为龙头的全球经济一体化浪潮正席卷世界,这是当今人类所面临的巨大挑战,人们将认真面对挑战的内涵和挑战所带来的机遇。而以IT(InformationTechnology)技术为基础的信息产业正深入到人类社会生活的方方面面,无论是生产制造、商业、国防和科技等领域、还是第三产业,计算机软件现已成为担当重任的核心力量,互联网和软件已成为推动新经济发展的重要基础。因此,计算机软件技术将是各类专业的大专生、本科生和研究生所必备的基础知识。

课程名称:

C++面向对象程序设计

面向对象程序设计OOP(Object-OrientedProgramming)是计算机软件开发方法的一场革命,目前广为流行的C++是面向对象程序设计语言的第一个大众化版本,是当前学习面向对象程序设计方法的首选语言。本课程以最新ANSI(AmericanNationalStandardsInstitute)C++作为准则,以美国Microsoft公司开发的VisualC++6.0为语言蓝本,系统介绍C++的主要语言特征,并用以讲述面向对象程序设计技术,使学生具有阅读和编写C++程序的能力。为进一步学习完全面向对象、面向计算机网络的Java语言打下牢固的基础。

讲课学时:32学时,2个学分教材:《面向对象程序设计》 刘正林编《C++习题解答与上机指导》 刘正林、周纯杰、刘烨编著

华中科技大学出版社读者服务部和教材出版科有售

第九章面向对象程序设计概论

1.1面向对象程序设计OOP(Object-OrientedProgramming)的基本思想和有关概念:1.面向对象程序设计的有关概念:

近10年来兴起的面向对象程序设计方法是一种新的软件开发方法,它是计算机软件开发方法的一场革命。对于21世纪的人才,不管从事何种专业,必须具有OOP的基本知识,否则将是不合格人才。近年来,由于高科技的飞速发展,如智能计算机、多媒体技术、计算机集成制造系统CIMS、人工智能等,迫切要求进一步改进系统的研究方法,特别要求提高计算机软件的开发效率和质量。过去所学的各种程序设计语言(包括C语言)都是面向功能的(FunctionOriented),称为传统的程序设计语言,使用这类语言来开发软件效率很低.首先要求编程者详细了解所研究对象的具体细节,包括它的功能、外观、内部结构、各种状态和基本原理等.然后再考虑在程序中如何用数据来描述它,还要花费很大精力研究出一些算法,设计出一些函数来操作这些数据,改变它的状态,并实现各种功能.这就是面向功能的程序定律: 程序=(算法)+(数据结构).所谓“算法”是一个有限条指令的集合,这些指令确定了解决某一特定类型问题的运算序列,它是一个独立的整体,数据结构(包括数据类型和数据)也是一个整体。两者分开设计,以算法(函数或过程)为主。

主函数函数1函数3函数3-1函数3-2函数2数据1数据2数据3图9.1算法与数据结构的关系

随着实践经验的不断积累,软件工程师越来越注重把数据结构与算法看作一个独立功能模块.程序定律重新认识:

程序=(算法+数据结构).即算法与数据结构是一个不可分割的整体,因为:a.算法总是离不开数据结构,算法是用来访问数据结构的,所以算法只能适用于特定的数据结构。b.程序设计时,最好使算法与数据结构构成一对一(1:1)的关系。c.若数据结构改变了,必须重新设计算法。

算法2

数据结构3

数据结构1

数据结构2

数据结构4

数据结构

算法1

算法2

只能与一个对应

同一种操作的不同算法实现是多余的图9.2算法与数据结构应为1:1关系

这种程序设计方法就类似于在硬件领域里,一个技术员安装一台电脑,若想给电脑添加一块“声卡”,是用原始的集成电路芯片和材料去制作一块“声卡”呢,还是向电脑制造厂商选购一块“声卡”。前者要求技术员要掌握“声卡”的基本原理、功能、内部结构、各种状态及调试技能等许多具体细节,显然这是一种效率很低的开发方法。软件开发如果走过去硬件的这条老路,矛盾更突出。

不仅开发效率难于提高,而且程序代码的可重用性和软件的可维护性很差。特别可维护性是软件产品质量的重要指标之一。因为软件产品不同于硬件产品,硬件产品一旦开发成功就是成熟的产品,而软件产品总是不断修改、完善,从不成熟逐步走向成熟,要求“可维护性好”是必不可少的。传统的结构化语言,例如C语言是用函数实现对数据结构的操作,这就是用函数实现算法。如前所述,算法与数据结构应构成一对一的关系,特定的函数往往是操作特定的数据结构。若程序在维修时,数据结构改变了,必须编写新的操作函数,这对程序的修改、完善极为不利。(1)封装性和数据隐藏:我们生活在高科技时代的社会里,科技成果是人类共同拥有的财富。人们是在某一程度的细节中生活,为了充分利用现代科技成果,减少必须处理的事情,根据所要达到的目的进行抽象,即抓住与目的有关的重要信息,忽略掉某些不重要的细节。例如,人类发明了电话,它已是人们进行通信的强有力的工具之一。但人类的绝大多数只是以“使用它”作为目的,只需知道它的功能和使用方法就可以使用电话,而不必了解电话是如何实现通话的具体实现细节。因此电话制造厂商将它们放在电话机壳内隐藏起来,封装成一个自成一体的电话机,而将一些操作按键安装在机壳上作为人-机操作的接口界面。人们只需操作电话机壳上的操作键就可以控制电话机实现与外界的通话。又如电脑制造厂商将“声卡”做成一块模板自成一体,这种“自成一体性”称为“封装性”(Encapsulation)。技术员关心的是“声卡”的功能,即只知道是做什么的,而并不关心“声卡”的工作原理和内部结构,是如何实现这些功能的,即不知道它是如何做的。无需知道封装单元是如何工作的就能使用的思想称为“数据隐藏”。当然“数据隐藏”也具有保护的作用,以防止外界的干扰破坏和误操作,如电话机壳对内部电路具有保护作用,但更重要的是隐藏了很多具体实现细节。

(2)对象(Object):是面向对象程序设计的核心概念。“对象”的概念并不神秘,它来源于生活。在现实生活中,其实我们每时每刻都在和对象打交道。例如,一本书、一台电脑、一部电话机,戴的手表、骑的自行车等,在面向对象程序员的眼中无一例外都看成“对象”。如果把问题抽象一下,会发现现实生活中的这些对象具有两个共同特点,第一,它们都有自己的状态。例如,一部电话有机型、大小、颜色等。第二它们都具有自己的行为。例如,电话有通话、拨打、挂起等行为。

在面向对象程序设计中,抽象是最基本的原则思想之一。什么是抽象呢?抽象是对现实世界中的实体进行简化的描述,使它模型化,即抓住编程者所关心的重要信息,而忽略掉一些不重要的细节部分,这是克服软件复杂性,将现实世界的模型在计算机中自然地表示出来的最好办法。因此,人们将对象的状态用数据来表示,称为对象的属性(attribute/Properties),而对象的行为用对象中的程序代码来实现,称为对象的方法(method),并将这数据和程序代码封装在一个实体内。例如:

structComplex{

doublereal;(C语言中的结构体)

doubleimag;};

classComplex{程序实体private:doublereal,imag;public:voidSet(doubler,doublei){real=r;imag=i;}

...};voidmain(){Complexa,b;//a,b是Complex类的实例变量,即该类的对象a.

Set(4.0,6.0);//用成员函数的调用来实现消息发送

b.Set(8.0,12.0);//用一条消息可发向多个对象

...}

因此,对象类是一个“状态”和“操作”的封装体。“状态”是由对象的数据结构的内容及其值定义的,方法是一系列的实现步骤,它由若干个“操作”组成的。例如,一个人有很多信息,姓名、年龄、身高、体重、文化程度、身份证号码等,但最重要的信息是姓名和身份证号码。这是人的重要属性。

2.面向对象程序设计的基本思想:面向对象程序设计的基本思想是在程序空间内,对客观世界中的实体,利用数据抽象的方法进行描述,即将一种数据结构和操作该数据结构的方法捆在一起,封装在一个程序实体内,从而实现了“数据隐藏”和“封装性”。即把数据结构隐藏在操作的后面,通过“操作”作为接口界面实现与外部的交流(消息传递)。对外部来讲,只知道“是做什么的”,而不知道“是如何做的”。

1.2面向对象程序设计的要点:面向对象程序设计语言应支持对象、类和继承(Inheritance)等要素,其要点为:1.客观世界是由各种对象(Object)组成,任何事物都是对象,是某个类(Class)的实例(instance)。在程序空间内,类是抽象数据类型(ADTAbstractDatatype)的实现。(1)由于客观世界是复杂的,人们在处理它们时,为了克服复杂性,常根据不同的目的将客观事物加以区别,按照事物的状态和特性(属性)、行为或用途进行分门别类,这就是归纳分类,简称“归类”。这种归类的结果便是逐步抽象的过程,最终可抽象出具有相同属性和相同行为的某一类对象。即找到了这一类对象的抽象数据类型ADT。于是在程序空间内,就可以编写一个类(class)的代码。例如,对于各种各样的飞机,今天看见一架波音747,它是一个对象,明天又看到一架图154,它也是一个对象,如此等等。如果将这一类对象抽取它们的共同特性,便可构造一个类”Airplane”(飞机)。描述飞机的所有共有特性:凡是飞机都能在空中飞行,具有改变飞行方向,控制飞行高度和速度的操作。飞机都具有机名、机型、飞行速度、高度、方向等数据,用来描述飞机的结构特性和状态等。而每架具体的飞机自然可作为这种类”Airplane”的一个实例。所以该类的抽象数据类型ADT为: 飞机的属性

飞机的操作(方法)

机名

改变飞行高度

机型

改变飞行方向

飞行高度

改变飞行速度

飞行方向

飞行速度

(2)什么是类:类是面向对象程序设计封装的基本单元,它被当作一个样板,用来生产该类的所有对象,就象将“类”比如成“饼干模具”,用来生产“饼干”之类的“对象”一样。因此一个类的所有对象都具有相同的数据结构,并且共享实现操作的程序代码。这就是说,在创建一个新对象时,该对象具有“类”定义中所描述的相同数据结构和操作它们的方法所对应的程序代码。而不必对每个新创建对象的操作代码和数据结构重新编写一次,从而大大减轻了编程者的劳动强度。再加上无数软件技术人员对OOP语言系统完成了标准类库的设计工作,形成了“应用程序框架”(ApplicationFramework)机制,为面向对象应用程序设计提供了有力的支持。例如VisualC++已为OOP应用程序的编程者提供了MFC(MicrosoftFoundationClass)标准类库和ATL(ActiveTemplateLibrary)活动模板类库作为“应用程序框架”。已为编程者预先定义了许多象窗体、按纽、滚动条和对话框等对象的标准类。当编程者需要这些类的对象时,例如要创建一个新的窗体,只需用窗体类创建一个实例即可。

既然现实世界是由各种对象组成,任何对象都具有一定的属性与操作,也就总能用数据结构和算法(操作该数据结构的方法)两者合一地加以描述。这样前述程序定律就变成: 对象=(算法+数据结构) 程序=(对象1+对象2+...)即程序就是许多对象在计算机中相继表现自己,而对象又是一个个程序实体。人们不再静止地去看待数据结构了,而把它看成是一个程序单位,一个程序分子或者一个对象的象征。它本身又包含有算法和数据结构,即“对象”,如图1.3所示。

数据结构

算法+数据结构

算法+数据结构

算法

对象

算法+数据结构

算法+数据结构

算法+数据结构

算法+数据结构

图1.3构成程序的对象

2.OOP采用消息(message)传递机制作为对象之间相互通信和作用的唯一方式。传统的结构化程序设计方法强调功能抽象和模块性,正如图1.4所示,每个模块都是一个过程,其输入与输出对应着处理过程前、后的数据。因此结构化程序设计方法将解题过程看作一系列的处理过程。由编程者编写调用“过程”的程序,对于相同的输入数据经“过程”处理后,每次输出结果都相同的,编程繁琐,使用不灵活。数据1数据2参数

f2()返回值

过程2参数

f1()返回值

数据3

数据5

过程1数据4

参数

f3()返回值

过程3图1.4传统的结构化方法

对象与传统的结构化程序设计方法中所说的数据有本质区别,对象本身具有很强的独立性,它不象结构化程序设计方法中的数据被动地等待对它执行某种操作。而是操作处理的主体,必须发消息(message)请求对象执行它的某个(算法)操作,正如图1.5所示,(算法)操作不是独立存在的实体,而是隶属于对象的,是对象的功能体现。其中MF1(MethodFunction,方法函数),...,MF4是隶属于对象的方法函数。每当需要改变对象的状态时,只能向对象发送消息来处理对象,消息带来了执行该操作的详细信息。C++是利用成员函数调用来实现消息发送。在成员函数体内,处理对象的数据改变其状态,对象收到消息后,按消息提供的详细信息(包括目标对象、所请求的操作方法和参数)激活本对象内相匹配的操作(成员函数),并执行该操作,返回所需要的结果,以响应这条消息。并且,同一条消息可同时发至多个对象,并允许这些对象按照自身的状态加以响应。因此与过程调用不同,同样的输入数据,可能因对象的状态不同而产生不同的输出结果。对人弹琴,对牛弹琴,情况各异。图1.5面向对象方法

消息2MF1MF1MF4对象1MF2MF4对象2MF2MF3MF3消息13.对象类将按照“父类”(或称基类),“子类”(或称派生类)的关系构成一个层次结构的系统。称为“类层次结构”。在这种“类层次结构”中,上层对象类所具有的属性和方法全部被下层对象类自动继承。因此,越在上层的类越具有普遍性和共性,越在下层的类越细化,越具体和专门化。(1)继承将客观世界中一般和特殊的关系模型化成层次结构。...

...

工人学生教师农民小学生中学生大学生研究生助教讲师教授图1.6“人”的类层次结构图

例如图1.6所示,小学生、中学生、大学生和研究生可归纳为“学生”,教授、讲师、助教可归纳为“教师”,学生、工人、教师、农民、...又可进一步用“人”加以概括,从而形成了类层次结构,一个类的上层可以有父类,下层可以有子类。例如:最上层的对象类“人”是“学生”类的基类而“学生”又派生出“小学生”、“中学生”、“大学生”、“研究生”等派生类。

在一个“类层次结构”中,每个类只允许一个基类时,类的继承是单继承,即类的层次结构为树结构。最上层的“人”为根结点,最下层的“小学生”、“中学生”、“大学生”、...等为叶结点,除根结点外,每个类都有它的基类,除了叶结点外,每个类都有它的派生类。一个派生类可以从它的基类那里继承所有的数据和操作,并扩充自己的特殊数据及其操作。基类抽象出共同的特征,派生类表达差别。当允许一个类有多个基类时,类的继承是多重继承。图1.6中“研究生”子类中,既攻读学位又从事教师工作时,就出现了既属于学生又属于教师的情况。ANSIC++

支持多重继承,因此功能更强,使用更方便。

人身份证号码:字符串(18位)姓名:字符串(20位)学生学校名称:字符串(30位)

学号:字符串(12位)

研究生

专业:字符串(30位)

入学年月日:结构类型Date

实例:研究生王平作为“人”

身份证号码:420106740112520

姓名:王平

专业:工业自动化

学校名称:中国华中理工大学

学号:59613022

作为“研究生”

入学年月日:1/9/1999

作为“学生”

图1.7类的继承

(2)通过继承增强程序代码的可重用性(reusable),代码的重用是利用继承基类的属性和方法来实现的。例如,由于研究生是学生的派生类,而学生又是人的派生类。因此,对于任一位研究生都应具有本类的属性:“专业”和“入学年月日”,还应当继承学生的属性:“学校名称”和“学号”,进而向上还应该继承人的属性:“身份证号码”和“姓名”。(3)在创建新的派生类时,只要指明新派生类是以哪一个已存在的类作为基类派生而来,就可自动继承基类的全部属性和方法。即新派生类只需定义新增加的属性和方法,不必再重复定义基类已有的属性和方法,减少了程序的冗余信息,节省了存储空间。如图1.7所示,在创建新的派生类例如学生时,只要指明新派生类是以“人”作为基类派生而来,就可自动继承基类“人”的全部属性和方法。即新派生类“学生”不必再重写一遍基类“人”中的“身份证号码”和“姓名”的程序代码,只需写出新增加的“学校名称”和“学号”等。同样只要指明研究生是学生的派生类,它自动继承了“身份证号码”、“姓名”、

“学校名称”、“学号”等。减少了程序的冗余信息,节省了存储空间。

(4)修改和扩充程序时也不必修改原有的程序代码,只需增加一些新的代码,因而也无需知道原有的程序模块是如何实现的,从而极大地减少了软件的维护工作量,这是实现软件重用的重要机制。

类的层次结构和继承性使得相似的对象可以共享程序代码的数据,不同对象的共有特性只需定义一次。从而大大减少了程序中的冗余信息。在创建新的派生类时,只要声明新的派生类以哪一个已存在的类作为基类,就可自动继承基类的全部特性,即新派生类不必再重定义基类已有的性质,减少程序的冗余信息,节省存储空间。同时使得用户在编写程序时不必从零开始,可继承原有程序模块的功能。修改和扩充程序时也不必修改原有的程序代码,只需增加一些新的代码,因而无须知道原有的程序模块是怎样实现的,从而极大地减少了软件维护工作量,这是实现软件重用的重要机制。在软件开发过程中,编程人员一次又一次地重复编制一些基本模式:分类,搜索,读写,分配,同步,比较......但这些事情并不是每次都一模一样的,有非常多的细节需要变化,因此软件工程师大多情况下是这样做的,时时不断地在同一主题上,精心雕琢着一个个新的变种。

4.面向对象和软件“IC"(IntegratedCircuits)a.软件IC的概念。在软件工程中要提高软件的生产率就应当走类似硬件的道路,应该有软件的“集成电路”(称软件IC)。因此,必须寻找一种能够比较容易地将正确成熟的软件单元应用于新的软件系统中的技术。最好有一种集成机制,将已经成熟的软件单元制成一个相对独立的实体,使它们可以不加改动或很少改动就可以应用于新的软件系统中。只有这样生产软件才可望减少重复劳动,提高生产率。“软件IC”的概念就是基于这一思想的一种软件集成机制。“软件IC"是一种可重用模块。具有如下特征:(1)模块性好,独立性强,可靠性高。一个“软件IC"是用于构造新软件系统的基本单位,应是可以独立存在的实体,它应当不受或少受外界的影响,以便自由地为各个不同的软件系统所用。(2)封装功能,连接简单,使用方便,作为集成机制,“软件IC"必须将集成的功能封装起来,使用者不必搞清楚它的内部细节,便能方便地连接,安全地用于新的软件,提高了软件的生产率。(3)内部功能的高效实现和清晰,简明的说明。"软件IC"是可重用的,内部代码实现的高效与否,直接影响到软件系统的性能。作为产品交给用户,它应当具有类似于硬件集成插件的功能及各项指标的说明,以便使用户可以根据需要选择合适的“软件IC”。

在面向对象语言中,对象类充当了系统构造的单元,支持“软件IC”技术。这是因为:(1)类是一类对象的统一模板;它具有很强的模块性。类的功能代码实现只通过外部接口与外界联系,具有很强的独立性,其可靠性表现在一个类的出错不会传播到其它类中,一个系统的类如果出错了,可以将其删除,作为一个降级的的系统使用,而不会使整个系统瘫痪。(2)类是对象一级的抽象,它将一类对象的数据结构的描述和其功能封装起来,使得外界不必清楚其内部实现细节,只要从它的说明中了解其基本功能,就可以使用它。(3)类之间的连接有继承性描述和一组外协消息,因而清晰,明了。

因此,面向对象方法实际上是当前软件开发中最接近问题的一种方法。它产生一种与现实世界具有自然关系的软件系统,是软件开发的一场革命。但面向对象的研究还不成熟。我们不能指望在许多领域马上有类似上述“软件IC"的产品出售,但在一个开发小组,或一个开发项目中自觉地“按对象方式思维(thinkinglikeanobject)”,采用面向对象的思想开发和组织软件系统是很有必要的。

1.3常用的C++产品

C++这种可靠、理想的语言虽然朴实无华,但却始终是建立快速、可靠windows应用程序的捷径,而且,因为采用新的应用程序框架,大大地提高了编程效率,因此它是倍受用户青睐的面向对象程序设计语言第一个大众化版本。

1.应用程序框架:是C++产品所提供的一个开发工具,有了它可以大大减少编写代码的工作量,它为编程者提供了极好的“拿来即用”的能力,充分体现了OOP的代码的可重用性。

OOP是软件开发领域的一次革命,它把事物分解成一个个的模块,就象是一个个集成电路块,每个模块完成一定的功能,只要各个模块是现成的,象集成电路块是一块块标准的芯片,我们就可以用它组合成一个新的应用软件,windows系统(windows3.1+DOSV6.22,windows95,WindowsNT)为微机提供了一个先进的OS,界面漂亮,使用方便,功能强大。但在Windows环境下编写应用程序的开发方法与DOS的应用程序有很大的差别。Windows是采用OOP的程序设计方法来设计的。只有采用这种方法设计才能和Windows系统保持一致。发挥Windows的优势,但它的程序设计思想在概念和结构上与DOS的应用程序有本质的区别,C++的产品理应提供一种开发工具,以确保开发的高质量和高效率。

BorlandC++采用一种新的应用程序机制,即应用程序框架称为对象窗口库(ObjectWindowsLibrary)简称OWL。它在Windows下以图形方式运行,OWL由于对应用程序代码隐藏了许多底细,消除了许多Windows应用程序开发中的繁琐工作。从而大大简化了Windows应用程序的编写过程。比如,Windows把窗口作为一标准窗口类,在自行编写的应用程序中自然要借用它来描述窗口的行为。虽然OWL提供了极其丰富的标准类库,但它不能把所有的问题全部包括在内,比如在一个应用程序中需要一个特殊形状的按钮,我们就不能直接利用OWL提供的标准类。而需要自行定义一个按钮类的派生类,在派生类中把特殊的需要加进去,特别在开发复杂程序的过程中。其思路必须使用“框架”的概念,利用OWL可以替编程者开发的应用程序创建合适的框架,并附有大量的插座,允许插入指明应用程序“做什么”的代码段。如图所示,已有现存的标准模块A、B,类似于硬件的标准芯片。OWL应用程序框架可提供大量的插座,插座A、B指明模块A、B“做什么”,正如同硬件一样构成一个新的应用程序。而编程者不能了解模块A和B,“怎么做”的具体细节,也不必掌握太多的框架知识,就能象用现成的集成电路标准芯片组合成一个新的机器。微软公司VisualC++提供的应用程序框架是微软基类数据库MicrosoftFoundationClasses.简称MFC,它已成为所有应用程序开发的标准。

SymantecC++通过设置编译器和链接

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论