面向对象程序设计(C++)第1讲概述龚勋【xgong@home.swjtu.edu.cn】本课程教学概述教学特点与重点课时少,内容多与c语言的异同OOP编程思想教材郑莉、董渊等,《C++语言程序设计》(第4版)自编教材学习建议认真阅读教材编写书上示例,熟练掌握c++语法2这门课教授方法“能够对现实世界中简单问题的计算描述”面向对象的基本概念p4类、对象、封装、继承、多态面向对象程序设计最大优点易于设计、便于维护掌握与C的语言区别(习惯养成)编程方式(代码组织、内存管理、数据管理)输入输出流异常处理…本讲主要内容(第1章)程序设计语言的发展面向对象思想与机制面向过程程序设计面向对象程序设计软件工程化方法开发环境4软件危机与程序设计方法论的演变“计算机软件”一词是1964年提出来的。这个时期,出产的软件越来越多,规模越来越大。1962年美国金星探测器发射失败并归咎于程序错误,造成计算机界的巨大震动。这个时期相继问世的大批软件系统,后来都纷纷发现其中存在不少错误。如:•著名的IBM公司的OS/360系统•耗资2.17亿美元的美国空军高级后勤系统,花费了几千人年,竟需要推倒重来。•阿波罗登月计划,也毫不例外地受到了软件错误的冲击。这一时期,可以说“没有不出错误的软件”。软件给人的印象是越来越不可靠,人们对使用软件无不提心吊胆。1.1程序设计方法与语言的发展历史这幅图景,被人们称之为“软件危机”,“软件危机”的爆发,促使人们总结反思出以下宝贵的经验教训:(1)程序的效率主要取决于算法的复杂度。算法一经确定,程序效率的大局已定;现有硬件速度越来越快;这两方面使得依靠编程技巧挣来的效率已非常有限。结果:提出了算法时间算杂度与空间复杂度的概念;开设专门研究算法的“数据结构”与“计算方法”课程。1.1程序设计方法与语言的发展历史(续1)(2)软件规模日益扩大,程序可靠性的问题越来越突出。追求效率的细节而忽略了主要流程的清晰,把程序复杂化,是导致程序出错的主要原因之一。同时,随着硬件技术的进步,新算法的涌现,使人们在程序设计时,不必强调效率问题,指导思想应当不失时机地从“效率第一”转向“清晰第一”。结果:于70年代末出现了第一个结构化程序设计语言PASCAL;80年代初又进一步提出和发展了面向对象程序设计语言。(3)程序生产要从根本上摒弃研制人员按爱好和习惯各自为政的个体手工业方式,而必须走向科学化、规范化、工程化、工业化。结果:于60年代末提出了软件工程方法学并逐步完善。1.1程序设计方法与语言的发展历史(续2)符合人类思维方式的编码方式才是最清晰的。1.1程序设计方法与语言的发展历史(续3)最早出现时间编程方法1946年ALOGOL,FORTRAN,BASIC,COBOL1954年PASCAL,C1969年面向过程结构化程序设计C++,Java80年代初面向对象程序设计LISP,PROLOG70年代中期人工智能程序设计面向过程程序设计程序语言高级语言机器语言汇编语言1.1C++与JavaJAVA教科书如是说:•JAVA和C++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继承,多态)。•而由于c++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!•JAVA则是完全的面向对象语言,它句法更清晰,规模更小,更易学它是在对多种程序设计语言进行了深入细致研究的基础上,据弃了其他语言的不足之处,从根本上解决了c++的固有缺陷。•Java和c++的相似之处多于不同之处,但两种语言问几处主要的不同使得Java更容易学习,并且编程环境更为简单。1.指针JAVA语言让编程者无法找到指针来直接访问内存。2.多重继承c++支持多重继承,Java不支持多重继承3.数据类型及类Java是完全面向对象的语言,Java中取消了c/c++中的结构和联合,消除了不必要的麻烦。4.自动内存管理5.操作符重载6.Java不支持缺省函数参数,而c十十支持7.“goto“语句“可怕”的goto语句是c和c++的“遗物”8.类型转换Java不支持c十十中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。1.1C++与Java(续)1.人类认识世界和发展世界的过程1.2面向对象思想与机制个体个性共性归纳共性个性个体演绎抽象派生继承机制1.面向对象的基本概念归纳的过程需要以大量的“实例”为基础。这些实例称为“对象”。对象在现实世界中也称为“实体”,在知识层面也称为“实例”。包括:物理对象(物理实体):在现实生活中看得见摸得着具有一定实际尺寸的实际存在的“物体”。比如:张三(人),太阳,这只花猫,那棵白菜等。逻辑对象(逻辑实体):这类对象也是真实存在的,但不一定看得见摸得着。比如课堂上的“例子”,法官断案时的“证据”,讲道理时所需要摆的“事实”等。1.2面向对象思想与机制(续2)“类”是相似物体的高度抽象,或者说,类是相似对象的特征抽象。简单来说,一个类都包含若干“成员”,这些成员代表了同类对象的“特征”:每个类的特征数量虽然有多有少,但都可以分为静态部分和动态部分。前者称为物理特征,或属性,或数据,后者称为行为特征,或动作,或方法。归结起来,一个类是由数据成员和方法成员构成的。1.2面向对象思想与机制(续3)人有姓名、年龄、身高、体重,思想遇到突发事件时有回应树有高度、宽度、命名适度浇水可以生长,扒掉树皮就会死亡电脑有品牌、显示器、主板、CPU加电就会运行,点击就有反应一个对象是个体存在,一个类只具有特征,但每一个特征都没有具体值。一个简单名词构成类。人们认识世界的过程,是从对象到类的过程。1.2面向对象思想与机制(续4)一个类是相同对象的共性。一个对象不仅具有特征,而且每一个特征都可以赋予具体值。在该名字前加上“这个”、“那个”等限定词后则构成对象。人们发展世界的过程,是从类到对象的过程。2.类与对象对象和对象之间是有关系的,彼此在“通信”和“交互”。这种交互过程就称为对象之间的消息传递。对象之间的消息传递是依靠“消息请求”、“消息处理”和“消息应答”过程来完成的。其中的“消息请求”和“消息应答”存在与两个对象之间,“消息处理”则是对象内部的动作或活动。消息传递机制可以有效地屏蔽消息处理的具体过程和内部细节,只对外呈现出相应的“接口”。1.2面向对象思想与机制(续5)3.消息传递正如,人对外提供的接口包括“口”、“耳”、“眼”等,但“消息处理”的过程——大脑活动的细节和思维方法则是对外隐藏的。1.2面向对象思想与机制(续6完)3.面向对象的机制什么是面向过程程序设计?指程序设计工作主要围绕设计解题过程来进行。传统的程序设计语言称为过程性语言。2.什么是结构化程序设计思想?自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;各模块之间的关系尽可能简单,在功能上相对独立;每一个模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。1.3面向过程程序设计3.结构化程序设计的优点(1)自顶向下逐步求精的方法符合人类解决复杂问题的普遍规律,因此可以显著提高编程效率。(2)用先全局后局部、先整体后细节、先抽象后具体的逐步求精过程开发的程序有清晰的层次结构,因此容易阅读理解。(3)不使用GOTO语句仅使用单入口单出口的控制结构,使得程序的静态结构和它的动态执行情况比较一致,因此,程序容易阅读和理解,开发时也较容易保证程序的正确性,即使出现错误也比较容易诊断和纠正。(4)控制结构有确定的逻辑模式,编写程序代码只限于使用很少几种直截了当的方式,因此源程序清晰流畅。1.3面向过程程序设计(续1)4.结构化程序设计的局限性(1)数据与处理数据的过程互相独立,当数据结构改变时,需要修改所有相关的过程,增加了程序变动和维护难度,并给程序的可靠性及安全性带来潜在的隐患。(2)可升级性及可重用性较差。升级或重用若仅局限于模块内部,比较方便,但涉及几个模块甚至模块的重新划分,最终可能导致全局性重新设计。(3)对复杂问题的描述能力有限。当程序描述的客观对象比较复杂(涉及大量数据),或功能不容易划分为相对比较独立的模块时,则模块设计时数据的共用,模块间的数据交换都变得十分复杂甚至难以设计。1.3面向过程程序设计(续2)比如,有下面的需求:张三的语文书的第38页的第1个字符是什么?李四的数学书的第50页的第8个字符是什么?王五的外语书的第23页的第20个字符是什么?1.3面向过程程序设计(续4)结构化抽象的例子chargetx(char*who,char*book,intpage,intpos){//函数具体操作}voidmain(){coutgetx(张三,语文,38,1);coutgetx(李四,数学,50,8);coutgetx(王五,外语,23,20);}需求大致一样,区别的地方有4个:谁的书,什么书,第多少页,第多少个字符面向对象抽象的例子voidmain(){cout张三.语文.C[38][1];cout李四.数学.C[50][8];cout王五.外语.C[23][20];}1.3面向过程程序设计(续5完)在该例子中,张三的语文和李四的语文完全可以不同,彼此独立,能够很好地实现个体维护而不影响其他。面向对象程序设计方法主张以对象为单位。需求中的人(张三、李四等)都是对象,不同的书也都是对象,每个对象彼此独立存在,互不干扰。1.什么是面向对象方法?首先,它将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体(称为对象)。对同类型对象抽象出其共性,形成类:类中的大多数数据,只能用本类的方法进行处理(封装性)。类通过一个简单一外部接口与外界发生关系,对象与对象之间通过消息进行通信。这样,程序模块间的关系就更为简单,程序模块的独立性、数据的安全性就有了很好的保障。另外,类还具有继承性与多态性,还可以大大提高程序的可重用性,使得软件的开发与维护都更为方便。1.4面向对象程序设计(1)认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。(2)对象用程序语言中称为类(class)的数据结构来描述。一个类由一组数据(称为成员变量或属性)和一组方法(即一组操作,由若干子程序实现)构成。数据表示类的状态、性质、属性等,而方法完成对数据的处理。(3)按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。子类具有基类的共性(称为继承-Inheritance)与自身的个性。(4)对象彼此之间仅能通过传递消息互相联系。2.面象对象方法的四个要点:一切局部于对象的私有信息,都被封装在该对象类的定义中,就好象装在一个不透明的黑盒子中,在外界是看不见的,更不能直接使用,这就是“封装性”。面向对象的方法可以用如下的方程式来概括:OO=Objects+Classes+Inheritance+CommunicationWithMessages注意:只有同时使用了以上四个要素(对象、类、继承和消息)的方法,才是真正面象对象的方法。例:对象抽象化的实例。(1)客观世界中“笔”的概念就可以抽象为一个基类对象,笔又可分为钢笔、铅笔、圆珠笔、毛笔等,因此可以在基类的基础上派生出如下的类对象体系。1.4面向对象程序设计(续2)笔钢笔铅笔圆珠笔毛笔基类子类(2)考察学校的所有人员,包括学生、教师、工人、职员、干部,我们可以将“人”抽象为一个基类对象,用姓名、生日、性别、民族、籍贯等数据项构成“人”这一基类的属性;在此基础上派生出学生、教师、工人、职员、干部各个子类。进一步以“学生”类为例,又可派生出本科生、专科生、研究生子类,“本科生”子类又可派生出统招本科生、网院本科生、成教本科生等。以“学生”子类为例,它具有基类“人”所具有的公共属性,并扩展出个性化的新属