C++面向对象程序设计第二章_第1页
C++面向对象程序设计第二章_第2页
C++面向对象程序设计第二章_第3页
C++面向对象程序设计第二章_第4页
C++面向对象程序设计第二章_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第第2章章 类和对象类和对象2.1 面向对象程序设计方法概述面向对象程序设计方法概述2.2 类的声明和对象的定义类的声明和对象的定义2.3 类的成员函数类的成员函数2.4 对象成员的引用对象成员的引用2.5 类和对象的简单应用类和对象的简单应用2.6 类的封闭性和信息隐蔽类的封闭性和信息隐蔽22.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) ;面向过程程序设计面向过程程序设计4 再考虑三个过程分别负责存款、取款和转

3、再考虑三个过程分别负责存款、取款和转账,可以设计三个函数:账,可以设计三个函数: MakeDeposit() WithDraw() Transfer() 这种数据结构与过程分离有很多问题,例这种数据结构与过程分离有很多问题,例如增加一种账户类型如增加一种账户类型退休账户退休账户(t),则三个函数都必须重新编写。则三个函数都必须重新编写。面向过程程序设计面向过程程序设计5class BankAccount public: void MakeDeposit(float amount); float WithDraw(float amount); bool Transfer(BankAccount

4、&to,float amount); private: char *owner; /账户账户 long account_number; /账号账号 float balance; /余额余额 float interestYTD; /年利息年利息 char account_type; /账户类型账户类型;2.1.1 什么是面向对象的程序设计什么是面向对象的程序设计6 客观世界中任何一个事物都可以看成一客观世界中任何一个事物都可以看成一个对象。对象可以是自然物体,也可以个对象。对象可以是自然物体,也可以是社会中的一种组织结构是社会中的一种组织结构(班级、系、学班级、系、学校校),甚至是一个图

5、形、一项计划等。,甚至是一个图形、一项计划等。 对象是构成系统的基本单位。任何一个对象是构成系统的基本单位。任何一个对象都具有对象都具有静态和动态静态和动态的特征。静态特的特征。静态特征称为征称为属性属性,动态特征称为,动态特征称为行为行为,外界,外界给对象发出的信息一般称作给对象发出的信息一般称作消息消息。1.对象对象71.封装封装2.抽象抽象3.继承继承4.多态多态面向对象与面向过程的不同面向对象与面向过程的不同8 早期的软件由于数据和程序混在一起,导早期的软件由于数据和程序混在一起,导致程序可读性很差,修改也困难。许多数致程序可读性很差,修改也困难。许多数据都混在一起,而这些数据又被多个

6、模块据都混在一起,而这些数据又被多个模块相互调用,某个模块在改动某个数据时常相互调用,某个模块在改动某个数据时常会对整个程序产生无法预料的错误。会对整个程序产生无法预料的错误。 面向面向对象提出了数据封装,它将每个数据对象提出了数据封装,它将每个数据都封装在各自的类中,又设置了多种访问都封装在各自的类中,又设置了多种访问权限,权限, 把它的一部分属性和功能向外界把它的一部分属性和功能向外界屏蔽,屏蔽,从而避免了非法操作和出错的可能。从而避免了非法操作和出错的可能。2.封装与信息隐蔽封装与信息隐蔽 9 在设计一个对象时,要周密地考虑如何在设计一个对象时,要周密地考虑如何进行封装,把不必让外界知道

7、的部分隐进行封装,把不必让外界知道的部分隐蔽起来。也就是说,把对象的内部实现蔽起来。也就是说,把对象的内部实现和外部行为分隔开来。和外部行为分隔开来。 封装性是面向对象程序设计的一个重要封装性是面向对象程序设计的一个重要特点,封装有两个含义:特点,封装有两个含义:2.封装与信息隐蔽封装与信息隐蔽 10 把有关的数据和操作代码封装在一个对把有关的数据和操作代码封装在一个对象中,形成程序中的一个基本单位,各象中,形成程序中的一个基本单位,各个对象之间相互独立,互不干扰。个对象之间相互独立,互不干扰。 把对象中的某些部分对外隐蔽,把对象中的某些部分对外隐蔽,即隐蔽即隐蔽其内部细节,只留下少量接口,以

8、便与其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外外界联系,接收外界的消息。这种对外界隐蔽的做法称为界隐蔽的做法称为信息隐蔽信息隐蔽。2.封装与信息隐蔽封装与信息隐蔽 11 面向面向对象思想要求将程序的每一部分都看对象思想要求将程序的每一部分都看做一个抽象的对象,做一个抽象的对象,可以将同类对象的共可以将同类对象的共同特征抽象出来,同特征抽象出来,从而形成从而形成一个一个类类。 抽象的作用是表示同一类事物的本质。抽象的作用是表示同一类事物的本质。 C和和C+中的数据类型就是对一批具体的中的数据类型就是对一批具体的数的抽象。数的抽象。 类是对象的抽象,而对象是类的特例类是对

9、象的抽象,而对象是类的特例(类类的具体表现形式的具体表现形式)。3.抽象抽象124.继承与重用继承与重用 如果已经建立名为如果已经建立名为A的类,现要建立一个的类,现要建立一个名为名为B的类,而的类,而B类与类与A类的内容基本相类的内容基本相同,只是在同,只是在A类基础上增加了一些属性和类基础上增加了一些属性和行为,这样只需在行为,这样只需在A类的基础上添加新内类的基础上添加新内容即可,这就是面向对象程序设计中的容即可,这就是面向对象程序设计中的继承继承机制。机制。 采用继承的方法可以利用一个已有的类采用继承的方法可以利用一个已有的类建立一个新的类,可以重用已有软件的建立一个新的类,可以重用已

10、有软件的一部分,这就是一部分,这就是软件重用软件重用。13 有几个相似而不完全相同的对象,在向有几个相似而不完全相同的对象,在向它们发出同一个消息是,它们分别执行它们发出同一个消息是,它们分别执行不同的操作,这种现象称为不同的操作,这种现象称为多态现象多态现象。 在在C+中所谓中所谓多态性多态性指:由继承而产生指:由继承而产生的相关的不同的新类,它的对象对同一的相关的不同的新类,它的对象对同一个消息会作出不同的响应。个消息会作出不同的响应。5.多态性多态性 14 传统的面向过程程序设计是围绕功能进传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能,一个行的,用一个函数实现一个功能,

11、一个函数可以使用任何一组数据,一组数据函数可以使用任何一组数据,一组数据可以被多个函数使用。当程序规模越来可以被多个函数使用。当程序规模越来越大,数据越来越多,操作越来越复杂,越大,数据越来越多,操作越来越复杂,这种方法容易出现错误,程序员往往感这种方法容易出现错误,程序员往往感到难以应付。到难以应付。2.1.2 面向对象程序设计的特点面向对象程序设计的特点15面向对象程序设计包括两个方面:面向对象程序设计包括两个方面:设计所需的各种类,即决定把哪些数据和操作设计所需的各种类,即决定把哪些数据和操作封装在一起。封装在一起。考虑怎样向对象发送消息考虑怎样向对象发送消息(调用对象的成员函调用对象的

12、成员函数数),实现所需的操作。这时设计程序象一个,实现所需的操作。这时设计程序象一个总调度,不断地向各个对象发送消息总调度,不断地向各个对象发送消息(命令命令),让这些对象活动起来让这些对象活动起来(激活这些对象激活这些对象),完成各,完成各自的职责范围工作,各个对象的操作完成,整自的职责范围工作,各个对象的操作完成,整体任务也就完成了。体任务也就完成了。2.1.2 面向对象程序设计的特点面向对象程序设计的特点16类是类是C+中十分重要的概念,它是实现中十分重要的概念,它是实现面向对象程序设计的基础。面向对象程序设计的基础。C+对对C改进,改进,其中最重要的就是增加了类这样一种类型。其中最重要

13、的就是增加了类这样一种类型。类是所有面向对象的语言的共同特征,所类是所有面向对象的语言的共同特征,所有面向对象的语言都提供了这种类型。一有面向对象的语言都提供了这种类型。一个有一定规模的个有一定规模的C+程序是由许多类构程序是由许多类构成的。可以说类是成的。可以说类是C+的灵魂。的灵魂。2.1.3 类和对象的作用类和对象的作用 17在面向过程的结构化程序设计中,用下在面向过程的结构化程序设计中,用下面的公式描述程序:面的公式描述程序: 程序程序=数据结构数据结构+算法算法算法和数据结构两者是相互独立的,是算法和数据结构两者是相互独立的,是分开设计的。分开设计的。面向过程的程序设计是以数据结构为

14、基面向过程的程序设计是以数据结构为基础的算法设计础的算法设计。2.1.3 类和对象的作用类和对象的作用 18基于对象和面向对象程序设计把一个算法基于对象和面向对象程序设计把一个算法和一组数据结构封装在一个对象:和一组数据结构封装在一个对象: 对象对象=数据结构数据结构+算法算法程序程序=(对象对象+对象对象+对象对象)+消息消息消息的作用就是对对象进行控制。程序设消息的作用就是对对象进行控制。程序设计的关键是设计好每个对象,以及确定向计的关键是设计好每个对象,以及确定向这些对象发出的命令,让各个对象完成相这些对象发出的命令,让各个对象完成相应的任务。应的任务。2.1.3 类和对象的作用类和对象

15、的作用 192.1.4 面向对象的软件开发面向对象的软件开发1. 面向对象分析面向对象分析2. 面向对象设计面向对象设计3. 面向对象编程面向对象编程4. 面向对象测试面向对象测试5. 面向对象维护面向对象维护20面向对象分析,要按照面向对象的概念面向对象分析,要按照面向对象的概念和方法,在对任务的分析中,从客观事和方法,在对任务的分析中,从客观事物和事物之间的关系归纳出有关对象物和事物之间的关系归纳出有关对象(对象的属性和行为)以及对象之间的(对象的属性和行为)以及对象之间的联系。并将具有相同属性和行为的对象联系。并将具有相同属性和行为的对象用一个类来表示。用一个类来表示。1.面向对象分析面

16、向对象分析21根据面向对象分析阶段形成的需求模型,根据面向对象分析阶段形成的需求模型,对每一部分分别进行具体的设计,首先是对每一部分分别进行具体的设计,首先是进行类的设计,类的设计可能包含多个层进行类的设计,类的设计可能包含多个层次(利用继承和派生机制)。然后以这些次(利用继承和派生机制)。然后以这些类为基础提出程序设计的思路和方法,包类为基础提出程序设计的思路和方法,包括了算法的设计。在此设计阶段,并不牵括了算法的设计。在此设计阶段,并不牵涉某一具体的计算机语言。涉某一具体的计算机语言。2.面向对象面向对象设计设计22根据面向对象设计的结果,用一种计算根据面向对象设计的结果,用一种计算机语言

17、把它写成程序。机语言把它写成程序。s C+s Dephis VBs Java3.面向对象编程面向对象编程23写完程序交付用户使用前,必须对程序写完程序交付用户使用前,必须对程序进行严格的调试,如果发现错误,要及进行严格的调试,如果发现错误,要及时改正。时改正。面向对象测试,是以类作为测试的基本面向对象测试,是以类作为测试的基本单元用面向对象的方法实施测试。单元用面向对象的方法实施测试。4.面向对象测试面向对象测试24任何软件产品在使用过程中,可能用户任何软件产品在使用过程中,可能用户需要改进软件的性能,这就需要修改程需要改进软件的性能,这就需要修改程序。由于采用了面向对象的方法,方便序。由于采

18、用了面向对象的方法,方便了维护程序。因为类的封装性,修改一了维护程序。因为类的封装性,修改一个类对其他类(非子类)影响很小,极个类对其他类(非子类)影响很小,极大提高了程序维护的效率。大提高了程序维护的效率。5.面向对象维护面向对象维护252.2.1 类和对象的关系类和对象的关系2.2.2 声明类类型声明类类型2.2.3 定义对象的方法定义对象的方法2.2.4 类和结构体类型的异同类和结构体类型的异同2.2 类的声明和对象的定义类的声明和对象的定义 26C+中对象的类型称为类中对象的类型称为类(class),类,类代表了某一批对象的共性和特征。代表了某一批对象的共性和特征。类是对类是对象的抽象

19、,而对象是类的具体实例象的抽象,而对象是类的具体实例。类是对象的模板,是用来定义对象的一种类是对象的模板,是用来定义对象的一种抽象类型。抽象类型。类是抽象的,不占用内存空间,而对象是类是抽象的,不占用内存空间,而对象是具体的,占用内存空间。具体的,占用内存空间。类是由若干个变量和相关的函数组成,而类是由若干个变量和相关的函数组成,而对象可以拥有这些变量和函数。对象可以拥有这些变量和函数。2.2.1 类和对象的关系类和对象的关系 27 声明一个类时需要回答三个问题:声明一个类时需要回答三个问题:1.类的名字是什么?类的名字是什么? 2.它在哪里定义?它在哪里定义? 3.它支持什么操作?它支持什么

20、操作? 使用类时不需要知道这个类是怎样实现使用类时不需要知道这个类是怎样实现的,相反,需要知道的是该类提供什么的,相反,需要知道的是该类提供什么操作。操作。2.2.2 声明类类型声明类类型 28Class Student int num; string name; char sex; void display();Student stu1,stu2;2.2.2 声明类类型声明类类型 声明类并没有为其声明类并没有为其分配内存空间,分配内存空间,只只是告诉编译器它包是告诉编译器它包含的成员是什么含的成员是什么29类定义格式:类定义格式:class 类名类名private: 私有成员私有成员 pub

21、lic: 公有成员公有成员 protected: 保护成员保护成员;class是保留字,声明类类型是保留字,声明类类型类名:按标识符取名。类名:按标识符取名。private、public、protected是是保留字,是成员访问限定保留字,是成员访问限定符,其后必须跟冒号。符,其后必须跟冒号。在类声明的在类声明的 后如不直接定义后如不直接定义对象就必须跟分号。对象就必须跟分号。2.2.2 声明类类型声明类类型 302.2.3 定义对象的方法定义对象的方法 1. 先声明类类型,然后再定义对象先声明类类型,然后再定义对象在声明类类型后,像定义变量一样定义在声明类类型后,像定义变量一样定义对象。对象

22、。(1) class 类名类名 对象名对象名 class Student stu1, stu2;(2) 类名类名 对象名对象名 Student stu1, stu2;为为对象分配内存空间,对象分配内存空间,存放对象的成员存放对象的成员312.在声明类类型的同时定义对象在声明类类型的同时定义对象 class student private: public: stu1, stu2;2.2.3 定义对象的方法定义对象的方法 323.不出现类名,直接定义对象不出现类名,直接定义对象 class private: public: stu1, stu2;M这种方法在这种方法在C+中虽然是合法的,但不中虽然

23、是合法的,但不提倡使用。提倡使用。2.2.3 定义对象的方法定义对象的方法 332.2.4 类和结构体类型的异同类和结构体类型的异同 C+允许用允许用struct定义一个类类型,这定义一个类类型,这是设计是设计C+时规定的一项原则:时规定的一项原则:C+必必须兼容须兼容C,让,让C程序不用修改就能在程序不用修改就能在C+环境中使用。环境中使用。 两种定义方法的区别两种定义方法的区别s 用用class声明的类如果不带成员访问限定符,声明的类如果不带成员访问限定符,所有成员默认为所有成员默认为private;s 用用struct声明的类如果不带成员访问限定声明的类如果不带成员访问限定符,所有成员默

24、认为符,所有成员默认为public。342.3 类的成员函数类的成员函数 2.3.1 成员函数的性质成员函数的性质2.3.2 在类外定义成员函数在类外定义成员函数2.3.3 内置函数内置函数2.3.4 成员函数的存储方式成员函数的存储方式352.3.1 成员函数的性质成员函数的性质 类的成员函数是函数的一种。类的成员函数是函数的一种。 成员函数与一般函数的区别:它属于一成员函数与一般函数的区别:它属于一个类,出现在类体中,可以被指定为个类,出现在类体中,可以被指定为public、private或或protected,可,可以访问本类中的所有成员。以访问本类中的所有成员。 一般将需要被外界调用的

25、成员函数指定一般将需要被外界调用的成员函数指定为为public,作为类与外界的,作为类与外界的对外接口对外接口。362.3.2 定义成员函数定义成员函数 方法方法1:直接在类体内定义,其格式:直接在类体内定义,其格式:class Student public: void display() coutnumendl;coutnameendl;coutsex hour minute sec ; 计算该类对象占用的字节数计算该类对象占用的字节数 cout sizeof(Time) endl;2.3.4 成员函数的存储方式成员函数的存储方式 422.4.1 用对象名和成员运算符访问成员用对象名和成员运

26、算符访问成员2.4.2 用指向对象的指针访问成员用指向对象的指针访问成员2.4.3 用对象的引用访问成员用对象的引用访问成员2.4 对象成员的引用对象成员的引用 43 格式:对象名格式:对象名.成员名成员名 stu1.display(); M 注意:只有成员函数可以访问类中的所注意:只有成员函数可以访问类中的所有成员,而在类外只能访问公有成员。有成员,而在类外只能访问公有成员。 如果在类外面用下面的语句是错误的:如果在类外面用下面的语句是错误的: stu1.num = 101012.4.1通过对象名和成员运算符访问成员通过对象名和成员运算符访问成员 44class Student public

27、: int num;Student stu, *p; p= &stu;coutnumendl;2.4.2 通过指向对象的指针访问成员通过指向对象的指针访问成员 (*p).numstu.num452.4.3 通过对象的引用来访问成员通过对象的引用来访问成员 class Student public: int num;Student stu; Student &s=stu;cout s.numendl;462.5 类和对象的简单应用举例类和对象的简单应用举例#include using namespace std;class Time public: int hour; int m

28、inute; int sec;int main() Time t1; Time &t2=t1; cint2.hour; cint2.minute; cint1.sec; coutt1.hour:t1.minute :t2.secendl;M在引用成员之前加对象名而不是类名在引用成员之前加对象名而不是类名M数据成员必须有初始值后才能访问,数据成员必须有初始值后才能访问,否则它们的值是不可预知的否则它们的值是不可预知的M对象只能调用类中存在的成员对象只能调用类中存在的成员47例例2.2 引用多个对象引用多个对象的成员的成员(1)程序程序(a)#include using namespace

29、 std;class Timepublic: int hour; int minute; int sec;48int main() Time t1; cint1.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& t) coutt.hour:t.minute :t.secendl;51例例2.3 用成员函数处理输入输出用成员函数处

30、理输入输出#include using namespace std;class Timepublic:void set_time() ;void show_time(); private:int hour;int minute;int sec;52int main() Time t1; t1.set_time(); t1.show_time(); Time t2; t2.set_time(); t2.show_time(); return 0; 53void Time:set_time() cinhour; cinminute; cinsec; void Time:show_time() co

31、uthour:minute :secendl;54例例2.4 在整型数组中找最大值在整型数组中找最大值#include using namespace std;class Array_max public: void set_value(); void max_value(); void show_value(); private: int array10; int max;55void Array_max:set_value() int i; for (i=0;iarrayi;void Array_max:max_value() int i; max=array0; for (i=1;ima

32、x) max=arrayi;void Array_max:show_value() coutmax=num; cinname; cinage; /新增加的新增加的 cinsex;void student : display() cout numendl; cout nameendl; cout age endl; /新增加的新增加的 coutsex endl; 当接口与实现当接口与实现(对数据的操作对数据的操作)分离时,只要分离时,只要类的接口没有改变,对私有实现的修改不会类的接口没有改变,对私有实现的修改不会影响程序的其他部分。影响程序的其他部分。63 信息隐蔽的信息隐蔽的好处好处 如果在编

33、译时发现类中的数据读写有错,如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访不必检查整个程序,只需检查本类中访问这些数据的成员函数。问这些数据的成员函数。这就使得程序这就使得程序(尤其是大程序尤其是大程序)的设计、修改和调试变的设计、修改和调试变得方便和简单。得方便和简单。642.6.2 类声明和成员函数定义的分离类声明和成员函数定义的分离 将类的声明将类的声明(包括成员函数的声明包括成员函数的声明)放在放在头文件中。在程序中只要把有关的头文件头文件中。在程序中只要把有关的头文件包含进来即可,不必在程序中重复写类的包含进来即可,不必在程序中重复写类的声明,以减少工作量,提高编程效率。声明,以减少工作量,提高编程效率。 而将类的成员函数的执行部分放在另外一而将类的成员函数的执行部分放在另外一个个.cpp文件,在该文件的开头加上如下文件,在该文件的开头加上如下代码使头文件与代码使头文件与.cpp相关联:相关联: #include *.h65/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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论