1 / 212

第三章 C++ 面向对象程序设计

第三章 C++ 面向对象程序设计. 面向对象程序设计. 武汉大学 赵小红. 本章主要内容. 面向对象程序设计概述: object oriented programming, OOP OOP 思想、 OOP 基本特点 C++ 类: 类的定义与实现、内联成员函数、构造与析构、 this 指针、静态成员、友元等 类继承: 基类和派生类、多重继承、虚基类 多态性: 虚函数,重载,模板. 结构化程序设计方法. 重点: 如何实现细节过程,将数据与函数分开。 特点: 自顶向下,逐步求精 —— 功能分解。 形式:

della
Download Presentation

第三章 C++ 面向对象程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 C++面向对象程序设计 面向对象程序设计 武汉大学 赵小红

  2. 本章主要内容 • 面向对象程序设计概述: • object oriented programming, OOP • OOP思想、OOP基本特点 • C++类: • 类的定义与实现、内联成员函数、构造与析构、this指针、静态成员、友元等 • 类继承: • 基类和派生类、多重继承、虚基类 • 多态性: • 虚函数,重载,模板

  3. 面向对象程序设计概述 结构化程序设计方法 重点: 如何实现细节过程,将数据与函数分开。 特点: 自顶向下,逐步求精——功能分解。 形式: 算法 + 数据结构 = 程序 主模块+若干个子模块(main()+子函数) 缺点: 程序的可重用性差、可维护性欠佳。 结构化程序设计方法是一种面向过程的程序设计方法,即一个程序是由多个过程(在C++中为函数)模块组成,过程之间通过函数参数和全局变量进行相互联系。

  4. 主函数 函数1 函数2 函数3 函数1-1 函数1-2 函数2-1 函数3-1 函数3-2 数据1 数据2 数据3 面向对象程序设计概述 软件方法的发展 • 程序=(算法)+(数据结构) • 程序=(算法+数据结构) • 对象=(算法+数据结构), 程序=(对象+对象+……) ---------结构化设计方法 系统整体性差 算法和数据结构是一个整体,算法只能适用于特定的数据结构,而一个数据结构也没必要设计多个算法进行同一种操作。 更注重系统整体关系的表示和数据模型技术 数据结构本身可能包含算法和数据结构 ------------面向对象的设计方法

  5. 面向对象程序设计概述 算法+数据结构 数据结构 算法+数据结构 算法+数据结构 算法+数据结构 对象 算法+数据结构 算法 构成程序的对象

  6. 面向对象方法的主要优点 • 与人类习惯的思维方法一致 • 稳定性好 • 可重用性好 • 可维护性好

  7. 面向对象程序设计概述 面向对象程序设计方法及特征 • 目的: • 实现软件设计的产业化。 • 观点: • 自然界是由实体(对象)所组成。 • 程序设计方法: • 使用面向对象的观点来描述模仿并处理现实问题。 • 要求: • 高度概括、分类、和抽象。

  8. 一台计算机 一项计划 实体对象 抽象对象 面向对象程序设计概述 对象 ( object )

  9. 面向对象程序设计概述 对象 ( object ) 什么是对象? 在面向对象程序设计中,对象是用来描述客观事物的一个实体,它反映了系统为之保存信息和与之交互的方法,它是构成系统的一个基本单元。 一个对象由一组属性和方法(行为或操作)组成。

  10. 面向对象程序设计概述 对象 ( object ) 对象构成要素: 标识符:是对象的名称,用来区别与其他对象。 属 性:是用来描述对象静态特征的一个数据项。 方 法:是用来描述对象动态特征和行为的一个操作。

  11. 面向对象程序设计概述 对象 ( object ) 例题:对象 “帐户” 的抽象描述 对象名 帐户 帐户号,户主,身份证号,地址,电话,密码,存款。 属性 修改显示帐户号,户主,身份证号,密码,存款等属性。 方法 注意点:1. 三要素成为一体 2. 三要素的区别

  12. 面向对象程序设计概述 类 ( class ) 对象2 对象1 对象4 对象3

  13. 面向对象程序设计概述 类 ( class ) 什么是类? 类是对对象的抽象描述。 类是具有相同数据结构(属性)和相同操作功能(行为)的对象的集合,它规定了这些对象的公共属性和行为方法。

  14. 面向对象程序设计概述 类 ( object ) 类与对象的关系 类  对 象 抽象定义 实 例 轿 车  车号**的轿车 学 生  学生王强 类 型  变量

  15. 面向对象程序设计概述 抽 象 • 抽象是指对具体问题(对象)进行概括,抽出一类对象的公共属性和行为并加以描述的过程。 • 抽象包括数据抽象和过程抽象(或行为抽象,或代码抽象)。 • 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。 • 过程抽象:描述某类对象的共有的行为特征或具有的功能。 • 抽象的实现:通过类的声明。 • 先注意问题的本质及描述,其次是实现过程或细节。

  16. 面向对象程序设计概述 抽象实例——钟表 • 数据抽象: int Hour, int Minute, int Second • 代码抽象: SetTime(), ShowTime()

  17. 面向对象程序设计概述 抽象实例——钟表类 class Clock { public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; };

  18. 面向对象程序设计概述 抽象实例——人 • 数据抽象: char *name,char *gender,int age,int id • 代码抽象: • 生物属性角度:GetCloth(), Eat(),Step(),… • 社会属性角度:Work(),Promote() ,…

  19. 方向盘 离合器 档 位 雨 刷 刹 车 音 响 油 门 车 灯 面向对象程序设计概述 问题提出: 每个开车的人都需要了解汽车的内部结构吗?

  20. 面向对象程序设计概述 封装(encapsulation) • 什么是封装? • 把对象的属性和方法结合成一个独立的单元,并尽可能隐蔽对象的内部细节。 • 一个清楚的边界。 所有对象的成分都在这个边界内。 • 一个接口。 外部通过这个接口访问对象的内部成员。 • 封装的目的 增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。

  21. 外部接口 边界 封装(encapsulation) • 实例: • class Clock • { • public: void SetTime(int NewH,int NewM, int NewS); void ShowTime(); • private: int Hour,Minute,Second; • }; 特定的访问权限

  22. 面向对象程序设计概述 封装(encapsulation) 封装的优点: ⒈ 数据独立; ⒉ 具有隐藏性和安全性; ⒊ 易于维护; ⒋ 简化编程。 封装的缺点: 需要更多的输入输出函数。

  23. 面向对象程序设计概述 人 教师 学生 职员

  24. 面向对象程序设计概述 继承(inheritance) 什么是继承? 继承是指一个新类可以从现有的类派生而来。新类继承了现有类的特性,包括属性和行为,并且可以修改或增加新的属性和行为,使之适合具体的需要。

  25. 面向对象程序设计概述 继承(inheritance) 继承的特点: 设 A 为基类, B 为派生类。 1. 共享性: 派生类具有基类所有特征 即:A  B 2. 区别性: 派生类不等于基类 即A≠B 3. 层次性: 表示了类与类之间的关系

  26. 面向对象程序设计概述 继承(inheritance) 继承的优点: 1. 减少原代码,即代码可重用。 2. 代码的相互独立性。 3. 易于维护。 4. 体现自然界之间的关系。

  27. 面向对象程序设计概述 多态性(polymorphism) 例:几何图形类层次中的多态性。其派生类“圆”、“长方形”、“三角形”等都有服务“求面积”。 几何图形 三角形 圆 长方形

  28. 面向对象程序设计概述 多态性(polymorphism) 什么是多态性? 同一名称,不同的功能实现方式。 目的:达到行为标识统一,减少程序中标识符的个数。 实现:重载和虚函数

  29. C++类 C++类 • 为了支持面向对象程序设计,C++在C语言结构(struct)数据类型的基础上引入了类这种抽象数据类型。 • C++面向对象编程实质上就是面向类编程,只有定义和实现了类,才能声明属于这个类的对象,才能通过对象使用定义的成员。 • 传统C程序员把编程重点放在函数的编写上,而C++程序员把重点放在类的定义和实现上。

  30. C++类 类的定义与实现 • C++类将对象的属性抽象为数据成员,将对象的行为抽象为成员函数,并对它们进行封装。数据成员又称成员变量,成员函数又称为方法。 • C++类在形式上类似于C语言中用户自定义的结构类型,但定义类时规定了成员的访问控制权限。 • 类的定义分为声明部分和实现部分: • 声明部分用来说明该类的成员,主要说明“干什么” • 实现部分对成员函数的具体操作进行定义,主要阐述“怎么干”

  31. 无顺序关系, 每部分允许 出现多次 C++类 C++类的声明形式 类是一种用户自定义类型,声明形式: class <类名> { private: <私有数据成员和私有成员函数的声明列表>; public: <公有数据成员和公有成员函数的声明列表>; protected: <保护数据成员和保护成员函数的声明列表>; };

  32. C++类 公有类型成员 • 在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数, 但必须通过一个对象作为对象的成员使用。

  33. C++类 私有类型成员 在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。 如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。

  34. C++类 保护类型成员 在关键字protected后面声明。与private类似,其差别表现在继承与派生时对派生类的影响不同。

  35. C++类 例 定义类Time(表示时间)。 私有数据成员hour、minute 和second只能在类的成员 函数中被访问或赋值; class Time{ private: // 最好不要省略private int hour; // 数据成员,表示小时 int minute; // 数据成员,表示分钟 int second; // 数据成员,表示秒 public: void setTime(int, int, int);// 成员函数,设置时间 void showTime(); // 成员函数,输出时间 }; 公有成员函数setTime、showTime 可在外部被调用,但必须通过一个 对象作为对象的成员使用。

  36. C++类 类的实现 • 类的实现实质上是类的成员函数的实现,即定义类的成员函数。 • 成员函数的定义形式与一般函数的定义形式基本相同,但必须在成员函数名前加上类名和作用域限定符(::)。 • 成员函数的定义也可放在类体内(该函数声明之处),这时成员函数将变成内联函数。

  37. C++类 例 类Time的实现 void Time::setTime(int h, int m, int s) { hour=(h>=0 && h<24) ? h:0; // 设置时间 minute=(m>=0 && m<60) ? m:0; second=(s>=0 && s<60) ? s:0; } void Time::showTime() { cout<<hour<<':'<<minute<<':'<<second<<endl; } private成员hour、minute和 second不允许外界存取, 所以为类Time增加两个 public成员函数,供外界 设置或显示private成员。

  38. C++类 成员数据 与一般的变量声明相同,但需要将它放在类的声明体中。

  39. C++类 成员函数 • 在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。 • 允许声明重载函数和带默认形参值的函数。

  40. C++类 内联成员函数 • 为了提高运行时的效率,对于较简单的函数可以声明为内联形式。 • 内联函数体中不要有复杂结构(如循环语句和switch语句)。 • 在类中声明内联成员函数的方式: • 将函数体放在类的声明中。 • 使用inline关键字。

  41. C++类 内联成员函数举例(一) class Point { public: void Init(int initX,int initY) { X=initX; Y=initY; } int GetX() {return X;} int GetY() {return Y;} private: int X,Y; };

  42. C++类 内联成员函数举例(二) class Point { public: void Init(int initX,int initY); int GetX(); int GetY(); private: int X,Y; };

  43. C++类 inline void Point:: Init(int initX,int initY) { X=initX; Y=initY; } inline int Point::GetX() { return X; } inline int Point::GetY() { return Y; }

  44. C++类 定义类的注意事项 • 在类体中不允许对所定义的数据进行初始化。 • 类中的数据成员可以是任意类型但是不能是自身的类对象。 • 提倡将类的定义放在头文件(.h)中,类的实现放在源文件(.cpp)中,而main主函数可以放在另一个源文件中。在源文件中用#include编译预处理指令包含头文件。

  45. C++类 C++程序结构: 程序=类定义+成员函数定义+主程序

  46. C++类 对 象 • 类的对象是该类的某一特定实例,即类类型的变量。 • 声明形式:类名 对象名; 例:Time EndTime; • 一旦定义了类的对象,系统将为其分配空间,并可向对象发送消息,对其进行操作。

  47. C++类 类中成员的访问方式 • 类中成员互访 • 直接使用成员名 • 类外访问 • 使用“对象名成员名”或“对象名->成员名”方式访问public属性的成员

  48. C++类 例:类Time的使用,声明对象并设置对象属性 main() { Time EndTime; // 声明对象EndTime EndTime.setTime(12, 23, 36); // 设置对象EndTime的时间 cout<<"The time is:"; EndTime.showTime(); // 显示对象EndTime的时间 }

  49. C++类 类的应用举例 设计一个学生成绩的简单管理程序,输入10个学生的3门成绩后,计算平均成绩,并在屏幕上输出。利用类来实现。

  50. 阶段课程小结 • 理解结构化设计方法与面向对象方法的区别 • 熟悉面向对象的程序设计方法,学习用面向对象的方法设计程序 • 理解掌握下列定义: • 对象、类、封装、继承、多态性 • 类的三个组成部分: • 类名、属性和方法 • 理解封装与继承的意义,以及与对现实世界抽象的联系 • 多态性及其作用。 • 熟悉类的定义、实现和使用 • 了解对象和类的关系

More Related