2.13k likes | 2.39k Views
第三章 C++ 面向对象程序设计. 面向对象程序设计. 武汉大学 赵小红. 本章主要内容. 面向对象程序设计概述: object oriented programming, OOP OOP 思想、 OOP 基本特点 C++ 类: 类的定义与实现、内联成员函数、构造与析构、 this 指针、静态成员、友元等 类继承: 基类和派生类、多重继承、虚基类 多态性: 虚函数,重载,模板. 结构化程序设计方法. 重点: 如何实现细节过程,将数据与函数分开。 特点: 自顶向下,逐步求精 —— 功能分解。 形式:
E N D
第三章 C++面向对象程序设计 面向对象程序设计 武汉大学 赵小红
本章主要内容 • 面向对象程序设计概述: • object oriented programming, OOP • OOP思想、OOP基本特点 • C++类: • 类的定义与实现、内联成员函数、构造与析构、this指针、静态成员、友元等 • 类继承: • 基类和派生类、多重继承、虚基类 • 多态性: • 虚函数,重载,模板
面向对象程序设计概述 结构化程序设计方法 重点: 如何实现细节过程,将数据与函数分开。 特点: 自顶向下,逐步求精——功能分解。 形式: 算法 + 数据结构 = 程序 主模块+若干个子模块(main()+子函数) 缺点: 程序的可重用性差、可维护性欠佳。 结构化程序设计方法是一种面向过程的程序设计方法,即一个程序是由多个过程(在C++中为函数)模块组成,过程之间通过函数参数和全局变量进行相互联系。
主函数 函数1 函数2 函数3 函数1-1 函数1-2 函数2-1 函数3-1 函数3-2 数据1 数据2 数据3 面向对象程序设计概述 软件方法的发展 • 程序=(算法)+(数据结构) • 程序=(算法+数据结构) • 对象=(算法+数据结构), 程序=(对象+对象+……) ---------结构化设计方法 系统整体性差 算法和数据结构是一个整体,算法只能适用于特定的数据结构,而一个数据结构也没必要设计多个算法进行同一种操作。 更注重系统整体关系的表示和数据模型技术 数据结构本身可能包含算法和数据结构 ------------面向对象的设计方法
面向对象程序设计概述 算法+数据结构 数据结构 算法+数据结构 算法+数据结构 算法+数据结构 对象 算法+数据结构 算法 构成程序的对象
面向对象方法的主要优点 • 与人类习惯的思维方法一致 • 稳定性好 • 可重用性好 • 可维护性好
面向对象程序设计概述 面向对象程序设计方法及特征 • 目的: • 实现软件设计的产业化。 • 观点: • 自然界是由实体(对象)所组成。 • 程序设计方法: • 使用面向对象的观点来描述模仿并处理现实问题。 • 要求: • 高度概括、分类、和抽象。
一台计算机 一项计划 实体对象 抽象对象 面向对象程序设计概述 对象 ( object )
面向对象程序设计概述 对象 ( object ) 什么是对象? 在面向对象程序设计中,对象是用来描述客观事物的一个实体,它反映了系统为之保存信息和与之交互的方法,它是构成系统的一个基本单元。 一个对象由一组属性和方法(行为或操作)组成。
面向对象程序设计概述 对象 ( object ) 对象构成要素: 标识符:是对象的名称,用来区别与其他对象。 属 性:是用来描述对象静态特征的一个数据项。 方 法:是用来描述对象动态特征和行为的一个操作。
面向对象程序设计概述 对象 ( object ) 例题:对象 “帐户” 的抽象描述 对象名 帐户 帐户号,户主,身份证号,地址,电话,密码,存款。 属性 修改显示帐户号,户主,身份证号,密码,存款等属性。 方法 注意点:1. 三要素成为一体 2. 三要素的区别
面向对象程序设计概述 类 ( class ) 对象2 对象1 对象4 对象3
面向对象程序设计概述 类 ( class ) 什么是类? 类是对对象的抽象描述。 类是具有相同数据结构(属性)和相同操作功能(行为)的对象的集合,它规定了这些对象的公共属性和行为方法。
面向对象程序设计概述 类 ( object ) 类与对象的关系 类 对 象 抽象定义 实 例 轿 车 车号**的轿车 学 生 学生王强 类 型 变量
面向对象程序设计概述 抽 象 • 抽象是指对具体问题(对象)进行概括,抽出一类对象的公共属性和行为并加以描述的过程。 • 抽象包括数据抽象和过程抽象(或行为抽象,或代码抽象)。 • 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。 • 过程抽象:描述某类对象的共有的行为特征或具有的功能。 • 抽象的实现:通过类的声明。 • 先注意问题的本质及描述,其次是实现过程或细节。
面向对象程序设计概述 抽象实例——钟表 • 数据抽象: int Hour, int Minute, int Second • 代码抽象: 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() ,…
方向盘 离合器 档 位 雨 刷 刹 车 音 响 油 门 车 灯 面向对象程序设计概述 问题提出: 每个开车的人都需要了解汽车的内部结构吗?
面向对象程序设计概述 封装(encapsulation) • 什么是封装? • 把对象的属性和方法结合成一个独立的单元,并尽可能隐蔽对象的内部细节。 • 一个清楚的边界。 所有对象的成分都在这个边界内。 • 一个接口。 外部通过这个接口访问对象的内部成员。 • 封装的目的 增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。
外部接口 边界 封装(encapsulation) • 实例: • class Clock • { • public: void SetTime(int NewH,int NewM, int NewS); void ShowTime(); • private: int Hour,Minute,Second; • }; 特定的访问权限
面向对象程序设计概述 封装(encapsulation) 封装的优点: ⒈ 数据独立; ⒉ 具有隐藏性和安全性; ⒊ 易于维护; ⒋ 简化编程。 封装的缺点: 需要更多的输入输出函数。
面向对象程序设计概述 人 教师 学生 职员
面向对象程序设计概述 继承(inheritance) 什么是继承? 继承是指一个新类可以从现有的类派生而来。新类继承了现有类的特性,包括属性和行为,并且可以修改或增加新的属性和行为,使之适合具体的需要。
面向对象程序设计概述 继承(inheritance) 继承的特点: 设 A 为基类, B 为派生类。 1. 共享性: 派生类具有基类所有特征 即:A B 2. 区别性: 派生类不等于基类 即A≠B 3. 层次性: 表示了类与类之间的关系
面向对象程序设计概述 继承(inheritance) 继承的优点: 1. 减少原代码,即代码可重用。 2. 代码的相互独立性。 3. 易于维护。 4. 体现自然界之间的关系。
面向对象程序设计概述 多态性(polymorphism) 例:几何图形类层次中的多态性。其派生类“圆”、“长方形”、“三角形”等都有服务“求面积”。 几何图形 三角形 圆 长方形
面向对象程序设计概述 多态性(polymorphism) 什么是多态性? 同一名称,不同的功能实现方式。 目的:达到行为标识统一,减少程序中标识符的个数。 实现:重载和虚函数
C++类 C++类 • 为了支持面向对象程序设计,C++在C语言结构(struct)数据类型的基础上引入了类这种抽象数据类型。 • C++面向对象编程实质上就是面向类编程,只有定义和实现了类,才能声明属于这个类的对象,才能通过对象使用定义的成员。 • 传统C程序员把编程重点放在函数的编写上,而C++程序员把重点放在类的定义和实现上。
C++类 类的定义与实现 • C++类将对象的属性抽象为数据成员,将对象的行为抽象为成员函数,并对它们进行封装。数据成员又称成员变量,成员函数又称为方法。 • C++类在形式上类似于C语言中用户自定义的结构类型,但定义类时规定了成员的访问控制权限。 • 类的定义分为声明部分和实现部分: • 声明部分用来说明该类的成员,主要说明“干什么” • 实现部分对成员函数的具体操作进行定义,主要阐述“怎么干”
无顺序关系, 每部分允许 出现多次 C++类 C++类的声明形式 类是一种用户自定义类型,声明形式: class <类名> { private: <私有数据成员和私有成员函数的声明列表>; public: <公有数据成员和公有成员函数的声明列表>; protected: <保护数据成员和保护成员函数的声明列表>; };
C++类 公有类型成员 • 在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数, 但必须通过一个对象作为对象的成员使用。
C++类 私有类型成员 在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。 如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。
C++类 保护类型成员 在关键字protected后面声明。与private类似,其差别表现在继承与派生时对派生类的影响不同。
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 可在外部被调用,但必须通过一个 对象作为对象的成员使用。
C++类 类的实现 • 类的实现实质上是类的成员函数的实现,即定义类的成员函数。 • 成员函数的定义形式与一般函数的定义形式基本相同,但必须在成员函数名前加上类名和作用域限定符(::)。 • 成员函数的定义也可放在类体内(该函数声明之处),这时成员函数将变成内联函数。
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成员。
C++类 成员数据 与一般的变量声明相同,但需要将它放在类的声明体中。
C++类 成员函数 • 在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。 • 允许声明重载函数和带默认形参值的函数。
C++类 内联成员函数 • 为了提高运行时的效率,对于较简单的函数可以声明为内联形式。 • 内联函数体中不要有复杂结构(如循环语句和switch语句)。 • 在类中声明内联成员函数的方式: • 将函数体放在类的声明中。 • 使用inline关键字。
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; };
C++类 内联成员函数举例(二) class Point { public: void Init(int initX,int initY); int GetX(); int GetY(); private: int X,Y; };
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; }
C++类 定义类的注意事项 • 在类体中不允许对所定义的数据进行初始化。 • 类中的数据成员可以是任意类型但是不能是自身的类对象。 • 提倡将类的定义放在头文件(.h)中,类的实现放在源文件(.cpp)中,而main主函数可以放在另一个源文件中。在源文件中用#include编译预处理指令包含头文件。
C++类 C++程序结构: 程序=类定义+成员函数定义+主程序
C++类 对 象 • 类的对象是该类的某一特定实例,即类类型的变量。 • 声明形式:类名 对象名; 例:Time EndTime; • 一旦定义了类的对象,系统将为其分配空间,并可向对象发送消息,对其进行操作。
C++类 类中成员的访问方式 • 类中成员互访 • 直接使用成员名 • 类外访问 • 使用“对象名成员名”或“对象名->成员名”方式访问public属性的成员
C++类 例:类Time的使用,声明对象并设置对象属性 main() { Time EndTime; // 声明对象EndTime EndTime.setTime(12, 23, 36); // 设置对象EndTime的时间 cout<<"The time is:"; EndTime.showTime(); // 显示对象EndTime的时间 }
C++类 类的应用举例 设计一个学生成绩的简单管理程序,输入10个学生的3门成绩后,计算平均成绩,并在屏幕上输出。利用类来实现。
阶段课程小结 • 理解结构化设计方法与面向对象方法的区别 • 熟悉面向对象的程序设计方法,学习用面向对象的方法设计程序 • 理解掌握下列定义: • 对象、类、封装、继承、多态性 • 类的三个组成部分: • 类名、属性和方法 • 理解封装与继承的意义,以及与对现实世界抽象的联系 • 多态性及其作用。 • 熟悉类的定义、实现和使用 • 了解对象和类的关系