版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 第第2章章 类和对象类和对象 2.1 面向对象程序设计方法概述面向对象程序设计方法概述 2.2 类的声明和对象的定义类的声明和对象的定义 2.3 类的成员函数类的成员函数 2.4 对象成员的引用对象成员的引用 2.5 类和对象的简单应用类和对象的简单应用 2.6 类的封闭性和信息隐蔽类的封闭性和信息隐蔽 2 2.1.1 什么是面向对象的程序设计什么是面向对象的程序设计 2.1.2 面向对象程序设计的特面向对象程序设计的特 点点 2.1.3 类和对象作用类和对象作用 2.1.4 面向对象的软件开发面向对象的软件开发 2.1 面向对象程序设计方法概述面向对象程序设计方法概述 3 银行系统允许顾
2、客开设不同类型的银行账户,银行系统允许顾客开设不同类型的银行账户, 包括现金账户、支票账户和贷款账户,同时包括现金账户、支票账户和贷款账户,同时 允许顾客存款、取款和转账。允许顾客存款、取款和转账。 首先考虑数据结构首先考虑数据结构 struct accout char *owner; /账户账户 unsigned long account_number; /账号账号 float balance; /余额余额 float interestYTD; /年利息年利息 char account_type; /账户类型账户类型(现金现金x,支票支票z,贷款贷款d) ; 面向过程程序设计面向过程程序设计
3、 4 再考虑三个过程分别负责存款、取款和转再考虑三个过程分别负责存款、取款和转 账,可以设计三个函数:账,可以设计三个函数: MakeDeposit() WithDraw() Transfer() 这种数据结构与过程分离有很多问题,例这种数据结构与过程分离有很多问题,例 如增加一种账户类型如增加一种账户类型退休账户退休账户(t), 则三个函数都必须重新编写。则三个函数都必须重新编写。 面向过程程序设计面向过程程序设计 5 class BankAccount public: void MakeDeposit(float amount); float WithDraw(float amount);
4、 bool Transfer(BankAccount private: char *owner; /账户账户 long account_number; /账号账号 float balance; /余额余额 float interestYTD; /年利息年利息 char account_type; /账户类型账户类型 ; 2.1.1 什么是面向对象的程序设计什么是面向对象的程序设计 6 客观世界中任何一个事物都可以看成一客观世界中任何一个事物都可以看成一 个对象。对象可以是自然物体,也可以个对象。对象可以是自然物体,也可以 是社会中的一种组织结构是社会中的一种组织结构(班级、系、学班级、系、学
5、校校),甚至是一个图形、一项计划等。,甚至是一个图形、一项计划等。 对象是构成系统的基本单位。任何一个对象是构成系统的基本单位。任何一个 对象都具有对象都具有静态和动态静态和动态的特征。静态特的特征。静态特 征称为征称为属性属性,动态特征称为,动态特征称为行为行为,外界,外界 给对象发出的信息一般称作给对象发出的信息一般称作消息消息。 1.对象对象 7 封装封装 抽象抽象 继承继承 多态多态 面向对象与面向过程的不同面向对象与面向过程的不同 8 早期的软件由于数据和程序混在一起,导早期的软件由于数据和程序混在一起,导 致程序可读性很差,修改也困难。许多数致程序可读性很差,修改也困难。许多数 据
6、都混在一起,而这些数据又被多个模块据都混在一起,而这些数据又被多个模块 相互调用,某个模块在改动某个数据时常相互调用,某个模块在改动某个数据时常 会对整个程序产生无法预料的错误。会对整个程序产生无法预料的错误。 面向面向对象提出了数据封装,它将每个数据对象提出了数据封装,它将每个数据 都封装在各自的类中,又设置了多种访问都封装在各自的类中,又设置了多种访问 权限,权限, 把它的一部分属性和功能向外界把它的一部分属性和功能向外界 屏蔽,屏蔽,从而避免了非法操作和出错的可能。从而避免了非法操作和出错的可能。 2.封装与信息隐蔽封装与信息隐蔽 9 在设计一个对象时,要周密地考虑如何在设计一个对象时,
7、要周密地考虑如何 进行封装,把不必让外界知道的部分隐进行封装,把不必让外界知道的部分隐 蔽起来。也就是说,把对象的内部实现蔽起来。也就是说,把对象的内部实现 和外部行为分隔开来。和外部行为分隔开来。 封装性是面向对象程序设计的一个重要封装性是面向对象程序设计的一个重要 特点,封装有两个含义:特点,封装有两个含义: 2.封装与信息隐蔽封装与信息隐蔽 10 把有关的数据和操作代码封装在一个对把有关的数据和操作代码封装在一个对 象中,形成程序中的一个基本单位,各象中,形成程序中的一个基本单位,各 个对象之间相互独立,互不干扰。个对象之间相互独立,互不干扰。 把对象中的某些部分对外隐蔽,把对象中的某些
8、部分对外隐蔽,即隐蔽即隐蔽 其内部细节,只留下少量接口,以便与其内部细节,只留下少量接口,以便与 外界联系,接收外界的消息。这种对外外界联系,接收外界的消息。这种对外 界隐蔽的做法称为界隐蔽的做法称为信息隐蔽信息隐蔽。 2.封装与信息隐蔽封装与信息隐蔽 11 面向面向对象思想要求将程序的每一部分都看对象思想要求将程序的每一部分都看 做一个抽象的对象,做一个抽象的对象,可以将同类对象的共可以将同类对象的共 同特征抽象出来,同特征抽象出来,从而形成从而形成一个一个类类。 抽象的作用是表示同一类事物的本质。抽象的作用是表示同一类事物的本质。 C和和C+中的数据类型就是对一批具体的中的数据类型就是对一
9、批具体的 数的抽象。数的抽象。 类是对象的抽象,而对象是类的特例类是对象的抽象,而对象是类的特例(类类 的具体表现形式的具体表现形式)。 3.抽象抽象 12 4.继承与重用继承与重用 如果已经建立名为如果已经建立名为A的类,现要建立一个的类,现要建立一个 名为名为B的类,而的类,而B类与类与A类的内容基本相类的内容基本相 同,只是在同,只是在A类基础上增加了一些属性和类基础上增加了一些属性和 行为,这样只需在行为,这样只需在A类的基础上添加新内类的基础上添加新内 容即可,这就是面向对象程序设计中的容即可,这就是面向对象程序设计中的 继承继承机制。机制。 采用继承的方法可以利用一个已有的类采用继
10、承的方法可以利用一个已有的类 建立一个新的类,可以重用已有软件的建立一个新的类,可以重用已有软件的 一部分,这就是一部分,这就是软件重用软件重用。 13 有几个相似而不完全相同的对象,在向有几个相似而不完全相同的对象,在向 它们发出同一个消息是,它们分别执行它们发出同一个消息是,它们分别执行 不同的操作,这种现象称为不同的操作,这种现象称为多态现象多态现象。 在在C+中所谓中所谓多态性多态性指:由继承而产生指:由继承而产生 的相关的不同的新类,它的对象对同一的相关的不同的新类,它的对象对同一 个消息会作出不同的响应。个消息会作出不同的响应。 5.多态性多态性 14 传统的面向过程程序设计是围绕
11、功能进传统的面向过程程序设计是围绕功能进 行的,用一个函数实现一个功能,一个行的,用一个函数实现一个功能,一个 函数可以使用任何一组数据,一组数据函数可以使用任何一组数据,一组数据 可以被多个函数使用。当程序规模越来可以被多个函数使用。当程序规模越来 越大,数据越来越多,操作越来越复杂,越大,数据越来越多,操作越来越复杂, 这种方法容易出现错误,程序员往往感这种方法容易出现错误,程序员往往感 到难以应付。到难以应付。 2.1.2 面向对象程序设计的特点面向对象程序设计的特点 15 面向对象程序设计包括两个方面:面向对象程序设计包括两个方面: 设计所需的各种类,即决定把哪些数据和操作设计所需的各
12、种类,即决定把哪些数据和操作 封装在一起。封装在一起。 考虑怎样向对象发送消息考虑怎样向对象发送消息(调用对象的成员函调用对象的成员函 数数),实现所需的操作。这时设计程序象一个,实现所需的操作。这时设计程序象一个 总调度,不断地向各个对象发送消息总调度,不断地向各个对象发送消息(命令命令), 让这些对象活动起来让这些对象活动起来(激活这些对象激活这些对象),完成各,完成各 自的职责范围工作,各个对象的操作完成,整自的职责范围工作,各个对象的操作完成,整 体任务也就完成了。体任务也就完成了。 2.1.2 面向对象程序设计的特点面向对象程序设计的特点 16 类是类是C+中十分重要的概念,它是实现
13、中十分重要的概念,它是实现 面向对象程序设计的基础。面向对象程序设计的基础。C+对对C改进,改进, 其中最重要的就是增加了类这样一种类型。其中最重要的就是增加了类这样一种类型。 类是所有面向对象的语言的共同特征,所类是所有面向对象的语言的共同特征,所 有面向对象的语言都提供了这种类型。一有面向对象的语言都提供了这种类型。一 个有一定规模的个有一定规模的C+程序是由许多类构程序是由许多类构 成的。可以说类是成的。可以说类是C+的灵魂。的灵魂。 2.1.3 类和对象的作用类和对象的作用 17 在面向过程的结构化程序设计中,用下在面向过程的结构化程序设计中,用下 面的公式描述程序:面的公式描述程序:
14、 程序程序=数据结构数据结构+算法算法 算法和数据结构两者是相互独立的,是算法和数据结构两者是相互独立的,是 分开设计的。分开设计的。 面向过程的程序设计是以数据结构为基面向过程的程序设计是以数据结构为基 础的算法设计础的算法设计。 2.1.3 类和对象的作用类和对象的作用 18 基于对象和面向对象程序设计把一个算法基于对象和面向对象程序设计把一个算法 和一组数据结构封装在一个对象:和一组数据结构封装在一个对象: 对象对象=数据结构数据结构+算法算法 程序程序=(对象对象+对象对象+对象对象)+消息消息 消息的作用就是对对象进行控制。程序设消息的作用就是对对象进行控制。程序设 计的关键是设计好
15、每个对象,以及确定向计的关键是设计好每个对象,以及确定向 这些对象发出的命令,让各个对象完成相这些对象发出的命令,让各个对象完成相 应的任务。应的任务。 2.1.3 类和对象的作用类和对象的作用 19 2.1.4 面向对象的软件开发面向对象的软件开发 1. 面向对象分析面向对象分析 2. 面向对象设计面向对象设计 3. 面向对象编程面向对象编程 4. 面向对象测试面向对象测试 5. 面向对象维护面向对象维护 20 面向对象分析,要按照面向对象的概念面向对象分析,要按照面向对象的概念 和方法,在对任务的分析中,从客观事和方法,在对任务的分析中,从客观事 物和事物之间的关系归纳出有关对象物和事物之
16、间的关系归纳出有关对象 (对象的属性和行为)以及对象之间的(对象的属性和行为)以及对象之间的 联系。并将具有相同属性和行为的对象联系。并将具有相同属性和行为的对象 用一个类来表示。用一个类来表示。 1.面向对象分析面向对象分析 21 根据面向对象分析阶段形成的需求模型,根据面向对象分析阶段形成的需求模型, 对每一部分分别进行具体的设计,首先是对每一部分分别进行具体的设计,首先是 进行类的设计,类的设计可能包含多个层进行类的设计,类的设计可能包含多个层 次(利用继承和派生机制)。然后以这些次(利用继承和派生机制)。然后以这些 类为基础提出程序设计的思路和方法,包类为基础提出程序设计的思路和方法,
17、包 括了算法的设计。在此设计阶段,并不牵括了算法的设计。在此设计阶段,并不牵 涉某一具体的计算机语言。涉某一具体的计算机语言。 2.面向对象面向对象设计设计 22 根据面向对象设计的结果,用一种计算根据面向对象设计的结果,用一种计算 机语言把它写成程序。机语言把它写成程序。 s C+ s Dephi s VB s Java 3.面向对象编程面向对象编程 23 写完程序交付用户使用前,必须对程序写完程序交付用户使用前,必须对程序 进行严格的调试,如果发现错误,要及进行严格的调试,如果发现错误,要及 时改正。时改正。 面向对象测试,是以类作为测试的基本面向对象测试,是以类作为测试的基本 单元用面向
18、对象的方法实施测试。单元用面向对象的方法实施测试。 4.面向对象测试面向对象测试 24 任何软件产品在使用过程中,可能用户任何软件产品在使用过程中,可能用户 需要改进软件的性能,这就需要修改程需要改进软件的性能,这就需要修改程 序。由于采用了面向对象的方法,方便序。由于采用了面向对象的方法,方便 了维护程序。因为类的封装性,修改一了维护程序。因为类的封装性,修改一 个类对其他类(非子类)影响很小,极个类对其他类(非子类)影响很小,极 大提高了程序维护的效率。大提高了程序维护的效率。 5.面向对象维护面向对象维护 25 2.2.1 类和对象的关系类和对象的关系 2.2.2 声明类类型声明类类型
19、2.2.3 定义对象的方法定义对象的方法 2.2.4 类和结构体类型的异同类和结构体类型的异同 2.2 类的声明和对象的定义类的声明和对象的定义 26 C+中对象的类型称为类中对象的类型称为类(class),类,类 代表了某一批对象的共性和特征。代表了某一批对象的共性和特征。类是对类是对 象的抽象,而对象是类的具体实例象的抽象,而对象是类的具体实例。 类是对象的模板,是用来定义对象的一种类是对象的模板,是用来定义对象的一种 抽象类型。抽象类型。 类是抽象的,不占用内存空间,而对象是类是抽象的,不占用内存空间,而对象是 具体的,占用内存空间。具体的,占用内存空间。 类是由若干个变量和相关的函数组
20、成,而类是由若干个变量和相关的函数组成,而 对象可以拥有这些变量和函数。对象可以拥有这些变量和函数。 2.2.1 类和对象的关系类和对象的关系 27 声明一个类时需要回答三个问题:声明一个类时需要回答三个问题: 类的名字是什么?类的名字是什么? 它在哪里定义?它在哪里定义? 它支持什么操作?它支持什么操作? 使用类时不需要知道这个类是怎样实现使用类时不需要知道这个类是怎样实现 的,相反,需要知道的是该类提供什么的,相反,需要知道的是该类提供什么 操作。操作。 2.2.2 声明类类型声明类类型 28 Class Student int num; string name; char sex; vo
21、id display(); ; Student stu1,stu2; 2.2.2 声明类类型声明类类型 声明类并没有为其声明类并没有为其 分配内存空间,分配内存空间,只只 是告诉编译器它包是告诉编译器它包 含的成员是什么含的成员是什么 29 类定义格式:类定义格式: class 类名类名 private: 私有成员私有成员 public: 公有成员公有成员 protected: 保护成员保护成员 ; class是保留字,声明类类型是保留字,声明类类型 类名:按标识符取名。类名:按标识符取名。 private、public、protected 是保留字,是成员访问限定是保留字,是成员访问限定 符
22、,其后必须跟冒号。符,其后必须跟冒号。 在类声明的在类声明的 后如不直接定义后如不直接定义 对象就必须跟分号。对象就必须跟分号。 2.2.2 声明类类型声明类类型 30 2.2.3 定义对象的方法定义对象的方法 1. 先声明类类型,然后再定义对象先声明类类型,然后再定义对象 在声明类类型后,像定义变量一样定义在声明类类型后,像定义变量一样定义 对象。对象。 (1) class 类名类名 对象名对象名 class Student stu1, stu2; (2) 类名类名 对象名对象名 Student stu1, stu2; 为为对象分配内存空间,对象分配内存空间, 存放对象的成员存放对象的成员
23、31 2.在声明类类型的同时定义对象在声明类类型的同时定义对象 class student private: public: stu1, stu2; 2.2.3 定义对象的方法定义对象的方法 32 3.不出现类名,直接定义对象不出现类名,直接定义对象 class private: public: stu1, stu2; M这种方法在这种方法在C+中虽然是合法的,但不中虽然是合法的,但不 提倡使用。提倡使用。 2.2.3 定义对象的方法定义对象的方法 33 2.2.4 类和结构体类型的异同类和结构体类型的异同 C+允许用允许用struct定义一个类类型,这定义一个类类型,这 是设计是设计C+时规
24、定的一项原则:时规定的一项原则:C+必必 须兼容须兼容C,让,让C程序不用修改就能在程序不用修改就能在C+ 环境中使用。环境中使用。 两种定义方法的区别两种定义方法的区别 s 用用class声明的类如果不带成员访问限定符,声明的类如果不带成员访问限定符, 所有成员默认为所有成员默认为private; s 用用struct声明的类如果不带成员访问限定声明的类如果不带成员访问限定 符,所有成员默认为符,所有成员默认为public。 34 2.3 类的成员函数类的成员函数 2.3.1 成员函数的性质成员函数的性质 2.3.2 在类外定义成员函数在类外定义成员函数 2.3.3 内置函数内置函数 2.3
25、.4 成员函数的存储方式成员函数的存储方式 35 2.3.1 成员函数的性质成员函数的性质 类的成员函数是函数的一种。类的成员函数是函数的一种。 成员函数与一般函数的区别:它属于一成员函数与一般函数的区别:它属于一 个类,出现在类体中,可以被指定为个类,出现在类体中,可以被指定为 public、private或或protected,可,可 以访问本类中的所有成员。以访问本类中的所有成员。 一般将需要被外界调用的成员函数指定一般将需要被外界调用的成员函数指定 为为public,作为类与外界的,作为类与外界的对外接口对外接口。 36 2.3.2 定义成员函数定义成员函数 方法方法1:直接在类体内定
26、义,其格式:直接在类体内定义,其格式: class Student public: void display() coutnumendl; coutnameendl; coutsex hour minute sec ; ; 计算该类对象占用的字节数计算该类对象占用的字节数 cout sizeof(Time) endl; 2.3.4 成员函数的存储方式成员函数的存储方式 42 2.4.1 用对象名和成员运算符访问成员用对象名和成员运算符访问成员 2.4.2 用指向对象的指针访问成员用指向对象的指针访问成员 2.4.3 用对象的引用访问成员用对象的引用访问成员 2.4 对象成员的引用对象成员的引用
27、 43 格式:对象名格式:对象名.成员名成员名 stu1.display(); M 注意:只有成员函数可以访问类中的所注意:只有成员函数可以访问类中的所 有成员,而在类外只能访问公有成员。有成员,而在类外只能访问公有成员。 如果在类外面用下面的语句是错误的:如果在类外面用下面的语句是错误的: stu1.num = 10101 2.4.1通过对象名和成员运算符访问成员通过对象名和成员运算符访问成员 44 class Student public: int num; ; Student stu, *p; p= coutnumendl; 2.4.2 通过指向对象的指针访问成员通过指向对象的指针访问成
28、员 (*p).numstu.num 45 2.4.3 通过对象的引用来访问成员通过对象的引用来访问成员 class Student public: int num; ; Student stu; Student cout s.numendl; 46 2.5 类和对象的简单应用举例类和对象的简单应用举例 #include using namespace std; class Time public: int hour; int minute; int sec; ; int main() Time t1; Time cint2.hour; cint2.minute; cint1.sec; cout
29、t1.hour:t1.minute :t2.secendl; M在引用成员之前加对象名而不是类名在引用成员之前加对象名而不是类名 M数据成员必须有初始值后才能访问,数据成员必须有初始值后才能访问, 否则它们的值是不可预知的否则它们的值是不可预知的 M对象只能调用类中存在的成员对象只能调用类中存在的成员 47 例例2.2 引用多个对象引用多个对象的成员的成员 (1)程序程序(a) #include using namespace std; class Time public: int hour; int minute; int sec; ; 48 int main() Time t1; cint
30、1.hour t1.minutet1.sec; coutt1.hour:t1.minute :t1.sect2.hourt2.minutet2.sec; coutt2.hour:t2.minute :t2.sect.hour; cint.minute; cint.sec; void show_time(Time 51 例例2.3 用成员函数处理输入输出用成员函数处理输入输出 #include using namespace std; class Time public: void set_time() ; void show_time(); private: int hour; int min
31、ute; int sec; ; 52 int main() Time t1; t1.set_time(); t1.show_time(); Time t2; t2.set_time(); t2.show_time(); return 0; 53 void Time:set_time() cinhour; cinminute; cinsec; void Time:show_time() couthour:minute :secendl; 54 例例2.4 在整型数组中找最大值在整型数组中找最大值 #include using namespace std; class Array_max publ
32、ic: void set_value(); void max_value(); void show_value(); private: int array10; int max; ; 55 void Array_max:set_value() int i; for (i=0;iarrayi; void Array_max:max_value() int i; max=array0; for (i=1;imax) max=arrayi; void Array_max:show_value() coutmax=num; cinname; cinage; /新增加的新增加的 cinsex; void
33、 student : display() cout numendl; cout nameendl; cout age endl; /新增加的新增加的 coutsex endl; 当接口与实现当接口与实现(对数据的操作对数据的操作)分离时,只要分离时,只要 类的接口没有改变,对私有实现的修改不会类的接口没有改变,对私有实现的修改不会 影响程序的其他部分。影响程序的其他部分。 63 信息隐蔽的信息隐蔽的好处好处 如果在编译时发现类中的数据读写有错,如果在编译时发现类中的数据读写有错, 不必检查整个程序,只需检查本类中访不必检查整个程序,只需检查本类中访 问这些数据的成员函数。问这些数据的成员函数。
34、这就使得程序这就使得程序 (尤其是大程序尤其是大程序)的设计、修改和调试变的设计、修改和调试变 得方便和简单。得方便和简单。 64 2.6.2 类声明和成员函数定义的分离类声明和成员函数定义的分离 将类的声明将类的声明(包括成员函数的声明包括成员函数的声明)放在放在 头文件中。在程序中只要把有关的头文件头文件中。在程序中只要把有关的头文件 包含进来即可,不必在程序中重复写类的包含进来即可,不必在程序中重复写类的 声明,以减少工作量,提高编程效率。声明,以减少工作量,提高编程效率。 而将类的成员函数的执行部分放在另外一而将类的成员函数的执行部分放在另外一 个个.cpp文件,在该文件的开头加上如下文件,在该文件的开头加上如下 代码使头文件与代码使头文件与.cpp相关联:相关联: #include *.h 65 /student.h #include Using namespace std; class student public: void setdata(); void display(); private: int num; string name; char sex; ; 66 /student.cpp #include #inc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024民法学总论期末考95+必刷题及答案
- 2026年新生财经素养测试题及答案
- 2026年青光眼知识测试题及答案
- 燃气户内安检2025年官方指定培训考试题及完整答案
- 2026年用样本推断总体测试题及答案
- 2026道德与法治四年级阅读角 阅读梦粱录选段
- 教学材料《会计》-第七章
- 2026四年级数学下册 观察物体的单元整合
- 人民交通出版社.3教学设计-2025-2026学年中职中职专业课汽车制造与维修类66 装备制造大类
- 客户服务流程标准化手册提升客户满意度和复购率
- 老年人截肢术护理
- 再生资源公司介绍
- 上海某高校学生心理健康事件应急干预与支持办法
- 安全生产管理及培训制度电力公司
- 企业联络员岗位职责细则
- 尾矿库安全事故案例
- 质量成本培训课件
- 2025成都铁路局集团笔试题目
- 智能卷帘门PLC控制完整设计方案
- 车间高温烫伤安全培训课件
- 浙江护理单招题库2025及答案解析
评论
0/150
提交评论