• 1. 《C++面向对象程序设计》教学内容 第1章 C++概述 第2章 类和对象 第3章 面向对象程序设计概述 第4章 进一步学习类和对象 第5章 堆与复制构造函数 第6章 继承性:派生类 第7章 运算符重载 第8章 虚函数和多态性 第9章 模板 第10章 类库和C++的标准模板库STL 第11章 输入输出流 第12章 异常处理
  • 2. 金尊和“计算机和软件的发展很快,新的概念名词和技术手段层出不穷,可谓日新月异。停留于表面的现象,可以让人眼花乱,应接不暇。 只有深入到本质,从哲学方法论的高度上看问题,找答案,才能如庖丁解牛,游刃有余。”
  • 3. 第3章 面向对象程序设计概述3.1  类与对象 3.2  消息和方法 3.3 什么是面向对象程序设计 3.4  数据抽象 3.5  封装性和信息隐藏 3.6  继承性与软件重用 3.7  多态性 3.8 面向对象的程序设计语言 3.9 面向对象的软件工程
  • 4. 3.1  类与对象3.1.1 对象 3.1.2 类 3.1.3 对象与类的关系
  • 5. 对象的广义定义什么是对象(object)? 现实世界中的任何一个事物都可以看成是一个对象。自然的实体: 一个人, 一辆汽车, 一个教师逻辑结构: 一个银行帐号, 一个学生的学籍档案,客户通信录
  • 6. 对象的特性对象是人们要研究的任何事物 ,其特性是: 1、每一个对象必须有一个名字以区别于其它对象; 2、用属性(或叫状态)来描述它的某些特征; 3、有一组操作,每一个操作决定对象的一种行为。 //这是关于对象的广义定义
  • 7. 面向对象的系统中的对象对象是基本的运行时实体,它既包含数据(属性),也包括作用与数据的操作(行为)。 一个对象把属性和行为封装成一个整体。 对象是数据和对数据的操作的结合体。 从程序设计者来看,对象是一个程序模块; 从用户来看,对象为他们提供了所希望的行为。
  • 8. 类的例子人类 水果类 鱼类 “类”是对一组具有共同属性特征和行为特征的对象的抽象。
  • 9. OOP中类的例子class Student{ int number; char *name; float score; public: Student (int number1,char * name1, float score1); ~Student( ); void modify(float score1); void print( ); };属性 操作
  • 10. 什么是类(class)?在C++语言中,我们通过定义新的数据类型来构成类。 在新的数据类型中,既包含数据内容又包含对数据的操作。 一个类所包含的方法和数据描述一组对象的共同行为和属性。
  • 11. 什么是类(class)? 一个类定义了一个大体上相似的对象。 把一组对象的共同特性加以抽象并存储在一个类中的能力,是面向对象技术最重要的一点。
  • 12. 对象与类的关系类是对一组性质相同的对象的描述,是对一组数据和方法的封装。 对象则是类的具体化,是类的实例。可以这样定义对象:对象是类的一个实例,包括了数据和过程。
  • 13. 3.2  消息和方法 3.2.1 消息 3.2.2 方法
  • 14. 消息 Message消息是要求某个对象执行其中某个功能操作的规格说明。 OOP中的一条消息由消息选择器(“消息操作”或“消息名”)及若干个参数和接受消息的对象三部分组成, 例如:student1. modify(score1);
  • 15. 消息的例子接受消息的对象 参数 ↓      ↓ student1. modify(score1); ↑ 消息名
  • 16. 发送消息与函数调用的比较1) 函数调用可以带或不带参量,但消息至少带一个参量(对象名或对象指针);它指明接受该消息的对象。消息选择器则告诉对响应作些什么。 2) 消息名(消息选择器或消息操作)类似于函数名,但二者之间的本质差别在于:函数名仅代表一段可执行的代码,而消息名的具体功能的实现取决于所接受消息的对象。
  • 17. 发送消息与函数调用的比较(续)3) 函数调用是过程式(面向过程)的即“如何做(How to do)”,而消息则是通知式(面向对象)的,即告诉对象“做什么(What to do)”,具体“如何做(How to do)”由对象根据接受到的消息自行确定。 lst.sort( ); 其中,lst代表一个链表对象,sort是表示排序的消息名。
  • 18. 方法(method) “方法”对应于对象的行为(能力),即它是实现对象所具有的功能操作的代码段。 在C++程序中,方法即是类中定义的成员函数,它是该类对象所能执行的操作的算法实现。 通常每个类中包含多个方法(即C++的成员函数),每个方法由方法名(函数名+参数表)和说明该成员函数的算法实现的一段代码所组成。
  • 19. 方法的例子void Student::print( ) { cout<<”number: ” <
  • 20. 3.3 什么是面向对象程序设计3.3.1 结构化程序设计方法 3.3.2 面向对象程序设计方法
  • 21. 表3.1 程序设计方法的发展过程1957~1972: 面向过程的程序设计 1968~1990 : 面向过程的结构化程序设计 1984~今: 面向对象的程序设计
  • 22. 结构化程序设计的基本思想按功能划分模块,分而治之。 分解系统时按照自顶向下的顺序,逐步求精。 设计时使各模块间的关系尽可能简单,功能上相对独立, 从而可单独验证模块的正确性。
  • 23. 结构化程序的组成 主控模块功能模块1功能模块7功能模块2功能模块3功能模块6功能模块5功能模块4图3.3 结构化程序的组成
  • 24. 结构化程序设计方法的基本特点把数据结构和处理数据的操作过程分离为相互独立的实体。 用数据表达实际问题中的信息; 程序代码则实现用于处理加工这些数据的算法。 简而言之,就是数据和操作代码分离。
  • 25. 数据和操作代码分离 产生的问题给程序员增加了负担:必须确保数据和代码匹配。 当数据结构改变时,所有相关的处理过程都要进行相应的修改。可维护性低。 即使要对不同的数据格式(结构和类型)作同样的处理计算,也必须编写不同的程序。可重用性不好。
  • 26. 面向对象程序设计用面向对象程序设计语言中的对象和类直接模拟现实世界中的对象,将问题空间直接映射到软件空间。 从而设计出尽可能直接、自然地表示问题求解方法的软件。 面向对象的这种思维方式符合人类的自然思维习惯,使我们能够在程序中自然地描述现实世界的实体和问题,增强了程序代码的可读性,有利于控制软件的复杂性。
  • 27. 模块化将一个复杂的大规模软件系统划分成几个规模较小、相对简单的模块,即分而治之。 面向对象程序设计方法是按对象来划分。 面向对象的软件系统由对象组成,对象之间通过消息传递互相联系,如图3.4所示。
  • 28. 面向对象的软件系统的组成 对象1对象2对象3对象4图中箭头表示对象之间的消息传递
  • 29. 对象作为程序模块面向对象的软件系统中每一个模块都是高度独立的对象,而对象是比功能模块粒度更大的模块。 对象是由数据和对数据的操作(代码)形成的一个整体。 面向对象程序设计采用封装的办法,使对象的内部实现与外界隔离,实现了信息隐藏,从而提供了更理想的模块化机制,显著地减少了程序模块间的相互干扰和依赖性。
  • 30. 数据抽象技术 将数据和对数据的操作封装在一起,作为一个相互依存、不可分割的整体——对象来处理,它采用数据抽象和信息隐藏技术。 它将具有相同特征的对象抽象成一个新的数据类型——类,并且考虑不同对象之间的联系和对象类的重用性
  • 31. 3.4  数据抽象 3.4.1 什么是抽象? 3.4.2 数据抽象和抽象数据类型
  • 32. 抽象性的例子class student { int number; char *name; float score; public: student( int number1,char * name1, float score1); ~student( ); void modify(float score1); void print( ); };抽象是有选择地忽略。
  • 33. 抽象性(Abstraction)抽象是对复杂的现实世界的简明的表示。 抽象强调了我们所关心的(感兴趣)的信息,而将我们不关心的其他信息忽略。
  • 34. 名家之言E.Dijkstra:“设计并实现一个大规模的软件的中心问题是怎样减小复杂度,一个途径就是通过抽象”。 Bjarne Stroustrup说:“在C++语言中,我一直在努力提高程序设计的抽象层次”。
  • 35. 抽象数据类型一个值集和作用在值集上的操作集 C++语言中的一个类就是一个抽象数据类型 每个抽象数据类型自成一个模块,模块的接口和内部实现分离开来, 使用模块的应用程序员只需要知道如何使用该模块,而不必知道模块内部是如何实现的, 也就是说,可以忽略模块内部的实现细节。
  • 36. 3.5  封装性和信息隐藏所谓封装(encapsulation) ,就是包含和隐藏对象信息,如内部数据结构和代码的能力。 在面向对象的程序中,通过创建对象将代码和数据捆绑在一起,并且在对象中包含了所有必需的代码和数据。 对象是支持封装的元素。 一个程序中的对象把现实世界中的实体的属性和行为封装成一个整体。
  • 37. 信息隐藏(information hiding ) 信息隐蔽(Information Hiding)的含义: 有效的模块化可以通过定义一组独立模块来实现,这些模块相互之间只交流软件功能必需的信息。 换句话说: 模块所包含的信息,不允许其它不需要这些信息的模块访问,独立的模块间仅仅交换为完成系统功能而必须交换的信息。
  • 38. 封装的好处封装性降低了程序设计的复杂度。 封装将操作对象的内部复杂性与应用程序的其他部分隔离开来。 应用程序员只需要通过对象的接口来操作对象完成特定的任务,而不需要知道对象内部复杂的细节。
  • 39. 封装的好处(续)提高了代码的安全性和可靠性; 通过类实现封装,集中和统一了对类中数据成员的所有操作,从而可避免因分散操作造成的错误。 能有效提到程序模块的独立性、可重用性和可维护性; 只要类的接口(即类的共有部分)保持不变,类的结构部分的任何变化(包括数据结构和算法)都不会对使用该类的源程序有所影响,源程序可以不做任何修改。
  • 40. 面向对象程序设计的主要特征抽象性 封装性 继承性 多态性
  • 41. 3.6  继承性与软件重用面向对象程序设计的第二个主要特征就是继承性,继承的目的就是为了重用(reuse)。 继承,就是在一个已有的类的基础上创建一个新类 ,这个新类获得了已有类的数据和操作代码,并且新类可以增加新的数据和操作代码。
  • 42. 继承与派生问题举例
  • 43. 派生类的概念在已有类的基础上新增自己的特性而产生新类的过程称为派生。 被继承的已有类称为基类(或父类)。 派生出的新类称为派生类(或子类)。 参见图3.5 类的继承
  • 44. 继承与派生的目的继承的目的:实现代码重用。 派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。 C++中类的继承层次自然地表达了人们分析问题时所用的分类结构。大大改善了软件系统的可理解性和可维护性。
  • 45. 继承的好处(1)继承性很好地实现了代码的重用。 (2)能改进软件系统的可维护性。 (3)继承性使已有的程序库具有清晰的层次结构关系。
  • 46. 3.7  多态性广义多态性:自然语言中的多态性; 面向对象程序设计中的多态性
  • 47. 什么是多态性?(广义)polymorphism,“many forms”:即多种形态 在自然语言中,多态性即是“一词多义”; 更准确地说,多态性是指相同的动词作用到不同类型的对象上, 例如: 驾驶摩托车 驾驶汽车 驾驶飞机 驾驶轮船 驾驶宇宙飞船
  • 48. 什么是多态性?(OOP)当不同对象接受到相同的消息产生不同的动作,这种性质称为多态性。 通俗地说,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作, 即用同样的接口访问功能不同的函数,从而实现“一个接口,多种方法”。
  • 49. 多态性的例子在C语言中,由于不支持多态,求绝对值的动作要求三个不同的函数名字: abs(), labs(),fabs() 分别用来求整数,长整数、浮点数的绝对值。 在C++语言中,由于支持多态,求绝对值的动作可以只用一个函数名: abs()
  • 50. 应用多态性的好处多态应用于OOP的目的是允许用一个名字来指定动作的一般类(即逻辑上相似的动作)。 从而带来以下的好处: 提高了处理问题的抽象级别; 降低了程序设计时的复杂性; 增强了软件的灵活性。
  • 51. 面向对象程序设计的优越性重用性:有利于软件生产率的提高; 符合人类的自然思维习惯,能够自然地描述现实世界的实体和问题:有利于控制软件的复杂性; 更好的模块化,便于多人分工和合作开发软件; 编写的代码有更好的可维护性;
  • 52. 3.8 面向对象的程序设计语言3.8.1 对象程序设计语言的发展概况 3.8.2 几种典型的面向对象程序设计语言
  • 53. 几种典型的OOPLSmalltalk C++ Java C#
  • 54. 3.9 面向对象的软件工程面向对象的分析(Object-Oriented Analysis,简称OOA) 面向对象的设计(Object-Oriented Design,简称OOD) 面向对象的编程(Object-Oriented Programming,简称OOP) 面向对象的测试(Object-Oriented Test,简称OOT) 面向对象的软件维护(Object-Oriented Software Maintain,简称OOSM)