c第1章(类和对象)

上传人:壹****1 文档编号:567477024 上传时间:2024-07-20 格式:PPT 页数:82 大小:358.02KB
返回 下载 相关 举报
c第1章(类和对象)_第1页
第1页 / 共82页
c第1章(类和对象)_第2页
第2页 / 共82页
c第1章(类和对象)_第3页
第3页 / 共82页
c第1章(类和对象)_第4页
第4页 / 共82页
c第1章(类和对象)_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《c第1章(类和对象)》由会员分享,可在线阅读,更多相关《c第1章(类和对象)(82页珍藏版)》请在金锄头文库上搜索。

1、第第1章章 类和对象类和对象第第2章章 关于类和对象的进一步讨论关于类和对象的进一步讨论第第3章章 运算符重载运算符重载基于对象的程序设计基于对象的程序设计第第1章章 类和对象类和对象1-1 面向对象程序设计方法概述面向对象程序设计方法概述1-2 类的声明和对象的定义类的声明和对象的定义1-3 类的成员函数类的成员函数1-4 对象成员的引用对象成员的引用1-5 类的封装性和信息隐蔽类的封装性和信息隐蔽1-6 类和对象的简单应用举例类和对象的简单应用举例对于规模比较小的程序,编程者可以直对于规模比较小的程序,编程者可以直接编写出一个面向过程的程序,详细地描述每一瞬时接编写出一个面向过程的程序,详

2、细地描述每一瞬时的数据结构及对其的操作过程。但是当程序规模较大的数据结构及对其的操作过程。但是当程序规模较大时,就显得力不从心了。时,就显得力不从心了。C+就是为了解决编写大程就是为了解决编写大程序过程中的困难而产生的。序过程中的困难而产生的。1-1 面向对象程序设计方法概述面向对象程序设计方法概述面向对象的程序设计的思路和人们日常生活面向对象的程序设计的思路和人们日常生活中处理问题的思路是相似的中处理问题的思路是相似的:在自然世界和社会生活中,一个复杂的事物总在自然世界和社会生活中,一个复杂的事物总是由许多部分组成的。是由许多部分组成的。1-1.1 什么是面向对象的程序设计什么是面向对象的程

3、序设计当人们生产汽车时,分别设计和制造发当人们生产汽车时,分别设计和制造发动机、底盘、车身和轮子,最后把它们动机、底盘、车身和轮子,最后把它们组装在一起。在组装时,各部分之间有组装在一起。在组装时,各部分之间有一定的联系,以便协调工作。这就是面一定的联系,以便协调工作。这就是面向对象的程序设计的基本思路。向对象的程序设计的基本思路。1. 对象对象客观世界中任何一个事物都可以看成一个对客观世界中任何一个事物都可以看成一个对象象(object)。对象是构成系统的基本单位。对象是构成系统的基本单位。任何一个对象都应当具有这两个要素,即属任何一个对象都应当具有这两个要素,即属性和行为性和行为,它能根据

4、外界给的信息进行相应的它能根据外界给的信息进行相应的操作。一个对象往往是由一组属性和一组行为操作。一个对象往往是由一组属性和一组行为构成的。构成的。一般来说,凡是具备属性和行为这两种要素一般来说,凡是具备属性和行为这两种要素的,都可以作为对象。的,都可以作为对象。在一个系统中的多个对象之间通过一定的渠道相互在一个系统中的多个对象之间通过一定的渠道相互联系,要使某一个对象实现某一种行为联系,要使某一个对象实现某一种行为(即操作即操作),应,应当向它传送相应的消息。对象之间就是这样通过发送当向它传送相应的消息。对象之间就是这样通过发送和接收消息互相联系的。和接收消息互相联系的。图图1-1在在C+中

5、,每个对象都是由数据和函数中,每个对象都是由数据和函数(即操作代即操作代码码)这两部分组成的这两部分组成的,见图见图1-2。数据体现了前面提到的数据体现了前面提到的“属性属性”,如一个三角形对象,如一个三角形对象,它的它的3个边长就是它的属性。函数是用来对数据进行个边长就是它的属性。函数是用来对数据进行操作的,以便实现某些功能,例如可以通过边长计算操作的,以便实现某些功能,例如可以通过边长计算出三角形的面积,并且输出三角形的边长和面积出三角形的面积,并且输出三角形的边长和面积计算三角形面积和输出有关数据就计算三角形面积和输出有关数据就是前面提到的行为,在程序设计方是前面提到的行为,在程序设计方

6、法中也称为法中也称为方法方法。调用对象中的函调用对象中的函数就是向该对象传送一个消息数就是向该对象传送一个消息,要要求该对象实现某一行为求该对象实现某一行为(功能功能)。2. 封装与信息隐蔽封装与信息隐蔽面向对象程序设计方法的一个重要特点就是面向对象程序设计方法的一个重要特点就是“封封装性装性” ,所谓所谓“封装封装”,指两方面的含义:,指两方面的含义: 一是将有关的数据和操作代码封装在一个对象中,一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互形成一个基本单位,各个对象之间相对独立,互不干扰。不干扰。二是将对象中某些部分对外隐蔽,即隐蔽其内部二是将对象中

7、某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外界隐蔽的做法称为信息隐外界的消息。这种对外界隐蔽的做法称为信息隐蔽蔽。3. 抽象抽象抽象的作用是表示同一类事物的本质。抽象的作用是表示同一类事物的本质。如一个三角形可以作为一个对象,如一个三角形可以作为一个对象,10个个不同尺寸的三角形是不同尺寸的三角形是10个对象。如果这个对象。如果这10个三角形对象有相同的属性和行为,个三角形对象有相同的属性和行为,可以将它们抽象为一种类型,称为三角可以将它们抽象为一种类型,称为三角形类型。形类型。4. 继承与重用继承与重用

8、如果在软件开发中已经建立了一个名为如果在软件开发中已经建立了一个名为A的的“类类”,又想另外建立一个名为,又想另外建立一个名为B的的“类类”,而后者与前者内容基本相同,而后者与前者内容基本相同,只是在前者的基础上增加一些属性和行只是在前者的基础上增加一些属性和行为,只需在类为,只需在类A的基础上增加一些新内容的基础上增加一些新内容即可。这就是面向对象程序设计中的继即可。这就是面向对象程序设计中的继承机制。承机制。 C+提供了继承机制,采用继承的方提供了继承机制,采用继承的方法可以很方便地利用一个已有的类法可以很方便地利用一个已有的类建立一个新的类。这就是常说的建立一个新的类。这就是常说的“软件

9、重用软件重用”(software reusability) 的思想。的思想。5. 多态性多态性在在C+中,所谓多态性中,所谓多态性(polymorphism)是指:是指: 由继承而产生的相关的不同的类,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性特征,能增加程序的灵活性。如,在如,在Windows环境下,用鼠标双击一环境下,用鼠标双击一个文件对象个文件对象(这就是向对象传送一个消息这就是向对象传送一个消息),如果对象是一个可执行文件,则会执,如果对象

10、是一个可执行文件,则会执行此程序,如果对象是一个文本文件,行此程序,如果对象是一个文本文件,则启动文本编辑器并打开该文件。则启动文本编辑器并打开该文件。传统的面向过程程序设计是围绕功能进行的,用一传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。个函数实现一个功能。 1-1.2 面向对象程序设计的特点面向对象程序设计的特点面向对象程序设计采取的是另外一种思面向对象程序设计采取的是另外一种思路。它面对的是一个个对象。实际上,路。它面对的是一个个对象。实际上,每一组数据都是有特定的用途的,是某每一组数据都是有特定的用途的,是某种操作的对象。也就是说,一组操作调种操作的对象。也就是说,

11、一组操作调用一组数据。用一组数据。程序设计者的任务包括两个方面:程序设计者的任务包括两个方面: 一是设计所需的各种类和对象,即决定一是设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;把哪些数据和操作封装在一起;二是考虑怎样向有关对象发送消息,以二是考虑怎样向有关对象发送消息,以完成所需的任务。完成所需的任务。类是所有面向对象的语言的共同特征,所有类是所有面向对象的语言的共同特征,所有面向对象的语言都提供了这种类型。面向对象的语言都提供了这种类型。基于对象就是基于类。与面向过程的程序不基于对象就是基于类。与面向过程的程序不同,基于对象的程序是以类和对象为基础的,同,基于对象的程序是以类

12、和对象为基础的,程序的操作是围绕对象进行的。在此基础上利程序的操作是围绕对象进行的。在此基础上利用了继承机制和多态性,就成为面向对象的程用了继承机制和多态性,就成为面向对象的程序设计。序设计。1-1.3 类和对象的作用类和对象的作用程序程序=算法数据结构算法数据结构对象对象 = 算法算法 数据结构数据结构程序程序 = (对象对象+对象对象+对象对象+) + 消息消息 或:或: 程序程序 = 对象对象s + 消息消息需要规范整个软件开发过程,明确软件开发需要规范整个软件开发过程,明确软件开发过程中每个阶段的任务,在保证前一个阶段工过程中每个阶段的任务,在保证前一个阶段工作的正确性的情况下,再进行

13、下一阶段的工作。作的正确性的情况下,再进行下一阶段的工作。这就是软件工程学需要研究和解决的问题。这就是软件工程学需要研究和解决的问题。面向对象的软件工程包括以下几个部分面向对象的软件工程包括以下几个部分: 1-1.4 面向对象的软件开发面向对象的软件开发1. 面向对象分析面向对象分析(OOA)面向对象的分析,要按照面向对象的概念和面向对象的分析,要按照面向对象的概念和方法,在对任务的分析中,从客观存在的事物方法,在对任务的分析中,从客观存在的事物和事物之间的关系,归纳出有关的对象和事物之间的关系,归纳出有关的对象(包括包括对象的属性和行为对象的属性和行为)以及对象之间的联系,并以及对象之间的联

14、系,并将具有相同属性和行为的对象用一个类将具有相同属性和行为的对象用一个类(class)来表示。建立一个能反映真实工作情来表示。建立一个能反映真实工作情况的需求模型。况的需求模型。2. 面向对象设计面向对象设计(OOD)根据面向对象分析阶段形成的需求模型,对根据面向对象分析阶段形成的需求模型,对每一部分分别进行具体的设计,首先是进行类每一部分分别进行具体的设计,首先是进行类的设计,类的设计可能包含多个层次的设计,类的设计可能包含多个层次(利用继利用继承与派生承与派生)。然后以这些类为基础提出程序设。然后以这些类为基础提出程序设计的思路和方法,包括对算法的设计。在设计计的思路和方法,包括对算法的

15、设计。在设计阶段,并不牵涉某一种具体的计算机语言,而阶段,并不牵涉某一种具体的计算机语言,而是用一种更通用的描述工具是用一种更通用的描述工具(如伪代码或流程如伪代码或流程图图)来描述。来描述。3. 面向对象编程面向对象编程(OOP)根据面向对象设计的结果,用一种计算根据面向对象设计的结果,用一种计算机语言把它写成程序,显然应当选用面机语言把它写成程序,显然应当选用面向对象的计算机语言向对象的计算机语言(例如例如C+),否则无否则无法实现面向对象设计的要求。法实现面向对象设计的要求。4. 面向对象测试面向对象测试(OOT)在写好程序后交给用户使用前,必须对程序在写好程序后交给用户使用前,必须对程

16、序进行严格的测试。测试的目的是发现程序中的进行严格的测试。测试的目的是发现程序中的错误并改正它。面向对象测试是用面向对象的错误并改正它。面向对象测试是用面向对象的方法进行测试,以类作为测试的基本单元。方法进行测试,以类作为测试的基本单元。5. 面向对象维护面向对象维护(object oriented soft maintenance,OOSM)因为对象的封装性,修改一个对象对其因为对象的封装性,修改一个对象对其他对象影响很小。利用面向对象的方法他对象影响很小。利用面向对象的方法维护程序,大大提高了软件维护的效率。维护程序,大大提高了软件维护的效率。在在C+中对象的类型称为类中对象的类型称为类(

17、class)。类代表类代表了某一批对象的共性和特征。了某一批对象的共性和特征。类是对象的抽象,而对象是类的具体实例类是对象的抽象,而对象是类的具体实例(instance)。1-2 类的声明和对象的定义类的声明和对象的定义 1-2.1 类和对象的关系类和对象的关系在在C+中也是先声明一个类类型,然后用它中也是先声明一个类类型,然后用它去定义若干个同类型的对象。对象就是类类型去定义若干个同类型的对象。对象就是类类型的一个变量。可以说类是对象的模板,是用来的一个变量。可以说类是对象的模板,是用来定义对象的一种抽象类型。定义对象的一种抽象类型。类是抽象的,不占用内存,而对象是具体的,类是抽象的,不占用

18、内存,而对象是具体的,占用存储空间。占用存储空间。在在C+中声明一个类类型和声明一个结构体类型是相中声明一个类类型和声明一个结构体类型是相似的。似的。下面是声明一个结构体类型的方法:下面是声明一个结构体类型的方法: struct Student int num;char name20;char sex;Student stud1,stud2; 1-2.2 声明类类型声明类类型现在声明一个类:现在声明一个类: class Student /以以class开头开头 int num;char name20; char sex; /以上以上3行是数据成员行是数据成员 void display( ) /

19、这是成员函数这是成员函数coutnum:numendl;coutname:nameendl; coutsex:sexendl; ;Student stud1,stud2; 一般是把数据隐蔽起来,而把成员函数作为对外界一般是把数据隐蔽起来,而把成员函数作为对外界的接口。的接口。class Student /声明类类型声明类类型 private: /声明以下部分为私有的声明以下部分为私有的int num;char name20; char sex; public: /声明以下部分为公用的声明以下部分为公用的void display( ) coutnum:numendl;coutname:namee

20、ndl;coutsex:sexendl; ;Student stud1,stud2; 对类类型的声明,可得到其一般形式如下:对类类型的声明,可得到其一般形式如下: class 类名类名 private:私有的数据和成员函数私有的数据和成员函数; public:公用的数据和成员函数公用的数据和成员函数;private和和public称为成员访问限定符称为成员访问限定符(member access specifier)。 可访问 性成员类型外部函数成员函数privateNYpublicYprotectedN注意:注意:在声明类类型时,声明为在声明类类型时,声明为private的成员和声明的成员和声

21、明为为public的成员的次序任意,既可以先出现的成员的次序任意,既可以先出现private部分,也可以先出现部分,也可以先出现public部分。部分。如果在类体中既不写关键字如果在类体中既不写关键字private,又不写又不写public,就默认为就默认为private。在一个类体中,关键字在一个类体中,关键字private和和public可以分可以分别出现多次。每个部分的有效范围到出现另一别出现多次。每个部分的有效范围到出现另一个访问限定符或类体结束时为止。个访问限定符或类体结束时为止。1-2.3 定义对象的方法定义对象的方法1.先声明类类型,然后再定义对象先声明类类型,然后再定义对象在在

22、C+中,声明了类类型后,定义对象有两种形式。中,声明了类类型后,定义对象有两种形式。(1) class 类名类名 对象名对象名 如如 class Student stud1,stud2;(2) 类名类名 对象名对象名 如如 Student stud1,stud2;2. 在声明类类型的同时定义对象在声明类类型的同时定义对象class Student /声明类类型声明类类型 public: /先声明公用部分先声明公用部分 void display( ) coutnum:numendl;coutname:nameendl;coutsex:sexendl; private: /后声明私有部分后声明私有

23、部分int num;char name20; char sex; stud1,stud2; /定义了两个定义了两个Student类的对象类的对象3. 不出现类名,直接定义对象不出现类名,直接定义对象class /无类名无类名private: /声明以下部分为私有的声明以下部分为私有的 public: /声明以下部分为公用的声明以下部分为公用的 stud1,stud2; /定义了两个无类名的类定义了两个无类名的类对象对象struct Student /用关键字用关键字struct来声明一个类来声明一个类 private: /声明以下部分为私有的声明以下部分为私有的 int num; /以下以下3

24、行为数据成员行为数据成员 char name20; char sex; public: /声明以下部分为公用的声明以下部分为公用的 void display( ) /成员函数成员函数 coutnum:numendl; coutname:nameendl; coutsex:sexendl; ;Student stud1,stud2; /定义了两个定义了两个Student类的对类的对象象1-2.4 类和结构体类型的异同类和结构体类型的异同用用struct声明的类,如果对其成员不作声明的类,如果对其成员不作private或或public的声明,系统将其默认为的声明,系统将其默认为public。用用c

25、lass定义的类,如果不作定义的类,如果不作private或或public声明,系统将其成员默认为声明,系统将其成员默认为private。如果希望成员是公用的,使用如果希望成员是公用的,使用struct比较方便,比较方便,如果希望部分成员是私有的,宜用如果希望部分成员是私有的,宜用class。建议尽量使用建议尽量使用class来建立类,写出完全体现来建立类,写出完全体现C+风格的程序。风格的程序。类的成员函数类的成员函数(简称类函数简称类函数)是函数的一种,是函数的一种,属于一个类的成员,出现在类体中。属于一个类的成员,出现在类体中。它可以被指定为它可以被指定为private(私有的私有的)、

26、public(公公用的用的)或或protected(受保护的受保护的)。1-3 类的成员函数类的成员函数 1-3.1 成员函数的性质成员函数的性质成员函数可以访问本类中成员函数可以访问本类中任何成员任何成员(包括私有包括私有的和公用的的和公用的),可以引用在本作用域中有效的,可以引用在本作用域中有效的数据。数据。一般的做法是将需要被外界调用的成员函数一般的做法是将需要被外界调用的成员函数指定为指定为public,它们是类的对外接口。它们是类的对外接口。并非要求把所有成员函数都指定为并非要求把所有成员函数都指定为public。可以在类体中只写成员函数的声明,而在类的外面进可以在类体中只写成员函数

27、的声明,而在类的外面进行函数定义。行函数定义。class Student public:void display( ); /公用成员函数原型声明公用成员函数原型声明private:int num;string name; char sex; /以上以上3行是私有数据成员行是私有数据成员 ;void Student display( ) /在类外定义在类外定义display类函数类函数coutnum:numendl; /函数体函数体coutname:nameendl; coutsex:sexendl; Student stud1,stud2; /定义两个类对象定义两个类对象1-3.2 在类外定义

28、成员函数在类外定义成员函数注意:注意:但成员函数在类外定义时,必须在函数名前面加上但成员函数在类外定义时,必须在函数名前面加上类名,予以限定类名,予以限定“ ”是作用域限定符是作用域限定符或称作用域运算符,用它声明或称作用域运算符,用它声明函数是属于哪个类的。函数是属于哪个类的。如果在作用域运算符如果在作用域运算符“ ”的前面没有类名,或者的前面没有类名,或者函数名前面既无类名又无作用域运算符函数名前面既无类名又无作用域运算符“ ”,如,如 display( ) 或或 display( )则表示则表示display函数不属于任何类,这个函数不是成员函数不属于任何类,这个函数不是成员函数,而是全

29、局函数,即非成员函数的一般普通函数。函数,而是全局函数,即非成员函数的一般普通函数。类函数必须先在类体中作原型声明,然后在类函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。之前,否则编译时会出错。如果一个函数,其函数体只有如果一个函数,其函数体只有23行,一般行,一般可在声明类时在类体中定义。多于可在声明类时在类体中定义。多于3行的函数,行的函数,一般在类体内声明,在类外定义。一般在类体内声明,在类外定义。如果在类体中定义的成员函数中不包括如果在类体中定义的成员函数中不包括循环等控制结构,循环等控制结构

30、,C+系统会自动将它们系统会自动将它们作为内联作为内联(inline)函数来处理。函数来处理。1-3.3 inline 成员函数成员函数C+要求对一般的内置函数要用关键字要求对一般的内置函数要用关键字inline声明,声明,但对类内定义的成员函数,可以省略但对类内定义的成员函数,可以省略inline如如 class Student public: void display( ) coutnum:numendl;coutname:nameendl; coutsex:sexendl; private:int num;string name; char sex;注意:注意: 如果成员函数不在类体内定

31、义,而在类体外如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置定义,系统并不把它默认为内置(inline)函数。函数。如果想将这些成员函数指定为内置函数,应当如果想将这些成员函数指定为内置函数,应当用用inline作显式声明。作显式声明。class Student public:inline void display( ); /声明此成员函数为内置函数声明此成员函数为内置函数private:int num;string name; char sex; ;inline void Student display( ) / 在类外定义内置函数在类外定义内置函数coutnum:num

32、endl; coutname:nameendl; coutsex:sexabc;可以用下面的语句来输出该类对象所占可以用下面的语句来输出该类对象所占用的字节数:用的字节数:coutsizeof(Time)endl;虽然调用不同对象的成员函数时都是执行同虽然调用不同对象的成员函数时都是执行同一段函数代码,但是执行结果一般是不相同的。一段函数代码,但是执行结果一般是不相同的。C+设立了一个名为设立了一个名为this的指针,用来指向不的指针,用来指向不同的对象。同的对象。需要说明:需要说明: (1) 不论成员函数在类内定义还是在类外不论成员函数在类内定义还是在类外定义,成员函数的代码段都用同一种方定

33、义,成员函数的代码段都用同一种方式存储。式存储。(2) 应当说明:应当说明: 常说的常说的“某某对象的成员某某对象的成员函数函数”,是从逻辑的角度而言的,而成,是从逻辑的角度而言的,而成员函数的存储方式,是从物理的角度而员函数的存储方式,是从物理的角度而言的,二者是不矛盾的。言的,二者是不矛盾的。访问对象中的成员可以有访问对象中的成员可以有3种方法:种方法: 通过对象名和通过对象名和成员运算符成员运算符访问对象中的成员访问对象中的成员;通过指向对象的通过指向对象的指针指针访问对象中的成员访问对象中的成员;通过对象的通过对象的引用变量引用变量访问对象中的成员。访问对象中的成员。1-4 对象成员的

34、引用对象成员的引用例如在程序中可以写出以下语句:例如在程序中可以写出以下语句: stud1.num=1001; /假设假设num已定义为公用的已定义为公用的整型数据成员整型数据成员访问对象中成员的一般形式为访问对象中成员的一般形式为对象名对象名.成员名成员名1-4.1 通过对象名和成员运算符访问对象中的成员通过对象名和成员运算符访问对象中的成员只能访问只能访问public成员,而不能访问成员,而不能访问private成员,如成员,如果已定义果已定义num为私有数据成员,下面的语句是错误的:为私有数据成员,下面的语句是错误的: stud1.num=10101; 在类外只能调用公用的成员函数。在一

35、个类中应当在类外只能调用公用的成员函数。在一个类中应当至少有一个公用的成员函数,作为对外的接口,否则至少有一个公用的成员函数,作为对外的接口,否则就无法对对象进行任何操作。就无法对对象进行任何操作。用指针访问对象中的成员用指针访问对象中的成员class Timepublic: /数据成员是公用的数据成员是公用的int hour;int minute;Time t,*p; /定义对象定义对象t和指针变量和指针变量pp=&t; /使使p指向对象指向对象tcouthour; /输出输出p指向的对象中的成员指向的对象中的成员hour在在p指向指向t的前提下,的前提下,p-hour,(*p).hour和

36、和t.hour三三者等价。者等价。1-4.2 通过指向对象的指针访问对象中的成员通过指向对象的指针访问对象中的成员通过引用变量来访问对象中的成员通过引用变量来访问对象中的成员:如果已声明了如果已声明了Time类,并有以下定义语句:类,并有以下定义语句: Time t1; /定义对象定义对象t1Time &t2=t1; /定义定义Time类引用变量类引用变量t2,并并 /使之初始化为使之初始化为t1coutt2.hour; /输出对象输出对象t1中的成员中的成员hour由于由于t2与与t1共占同一段存储单元共占同一段存储单元(即即t2是是t1的别名的别名),因此因此t2.hour就是就是t1.h

37、our。1-4.3 通过对象的引用变量来访问对象中的成员通过对象的引用变量来访问对象中的成员类中公共成员函数是用户使用类的公用接口,类中公共成员函数是用户使用类的公用接口,被操作的数据是私有的,实现的细节对用户是被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现隐蔽的,这种实现称为私有实现。这种这种“类的类的公用接口与私有实现的分离公用接口与私有实现的分离”形成了信息隐蔽。形成了信息隐蔽。1-5 类的封装性和信息隐蔽类的封装性和信息隐蔽 1-5.1 公用接口与私有实现的分离公用接口与私有实现的分离信息隐蔽信息隐蔽是软件工程中一个非常重要的概念。是软件工程中一个非常重要的概念。

38、它的好处在于:它的好处在于: (1) 如果想修改或扩充类的功能,只需修改本如果想修改或扩充类的功能,只需修改本类中有关的数据成员类中有关的数据成员和与它有关的成员函数,和与它有关的成员函数,程序中类外的部分可以不必修改。程序中类外的部分可以不必修改。(2) 如果在编译时发现类中的数据读写有错,如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些不必检查整个程序,只需检查本类中访问这些数据的少数成员函数数据的少数成员函数。class Time /定义定义Time类类public: /数据成员为公用的数据成员为公用的 int hour; int minute; /int s

39、ec;void display()couthour“:”minuteendl;在面向对象的程序开发中,一般做法是将类在面向对象的程序开发中,一般做法是将类的声明放在指定的头文件中,用户如果想用该的声明放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明。在程序中重复书写类的声明。为了实现为了实现信息隐蔽信息隐蔽,对类成员函数的定义一,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中。般不放在头文件中,而另外放在一个文件中。1-5.2 类声明和成员函数定义的分离类声明和成员函数定义的分离例如,可以分别

40、写两个文件:例如,可以分别写两个文件: /student.h (这是头文件,在此文件中进行类的声明这是头文件,在此文件中进行类的声明)class Student /类声明类声明 public:void display( ); /公用成员函数原型声明公用成员函数原型声明private:int num; char name20; char sex; ;/student.cpp /在此文件中进行函数的定义在此文件中进行函数的定义#include #include student.h /不要漏写此行,否则编译通不过不要漏写此行,否则编译通不过void Student display( ) /在类外定义

41、在类外定义display类函数类函数coutnum:numendl; coutname:nameendl; coutsex:sexendl; /main.cpp 主函数模块主函数模块#include #include student.h /将类声明头文件包含进来将类声明头文件包含进来int main( )Student stud; /定义对象定义对象stud.display( ); /执行执行stud对象的对象的display函数函数return 0;这是一个包括这是一个包括3个文件的程序,组成两个文件模块个文件的程序,组成两个文件模块 。在预编译时会将头文件在预编译时会将头文件student

42、.h中的内容取代中的内容取代#include student.h行。行。请注意:请注意: 由于将头文件由于将头文件student.h放在用户当前目录放在用户当前目录中,因此在文件名两侧用双撇号包起来中,因此在文件名两侧用双撇号包起来(student.h)而不用尖括号而不用尖括号(),否则否则编译时会找不到此文件。编译时会找不到此文件。图图1-6在实际工作中,并不是将一个类声明做成一个头文在实际工作中,并不是将一个类声明做成一个头文件,而是将若干个常用的功能相近的类声明集中在一件,而是将若干个常用的功能相近的类声明集中在一起,形成类库。起,形成类库。类库有两种:类库有两种: 一种是一种是C+编译

43、系统提供的标准类库;编译系统提供的标准类库;一种是用户根据自己的需要做成的用户类库,提供给一种是用户根据自己的需要做成的用户类库,提供给自己和自己授权的人使用,这称为自定义类库。在程自己和自己授权的人使用,这称为自定义类库。在程序开发工作中,类库是很有用的,它可以减少用户自序开发工作中,类库是很有用的,它可以减少用户自己对类和成员函数进行定义的工作量。己对类和成员函数进行定义的工作量。类库包括两个组成部分:类库包括两个组成部分: (1)类声明头文件;类声明头文件; (2)已经过编译的成员函数的定义,它是目标文件。已经过编译的成员函数的定义,它是目标文件。用户只需把类库装入到自己的计算机系统中用

44、户只需把类库装入到自己的计算机系统中(一般装一般装到到C+编译系统所在的子目录下编译系统所在的子目录下),并在程序中用,并在程序中用#include命令行将有关的类声明的头文件包含到程序命令行将有关的类声明的头文件包含到程序中,就可以使用这些类和其中的成员函数,顺利地运中,就可以使用这些类和其中的成员函数,顺利地运行程序。行程序。类的成员函数在面向对象程序理论中被称为类的成员函数在面向对象程序理论中被称为“方法方法”(method),“消息消息”,其实就是一个命令,由程序语句来实现。,其实就是一个命令,由程序语句来实现。stud.display( );就是向对象就是向对象stud发出的一个发出

45、的一个“消息消息”,通知它执行其,通知它执行其中的中的display“方法方法”上面这个语句涉及上面这个语句涉及3个术语:个术语: 对对象、方法和消息。象、方法和消息。stud是对象,是对象,display( )是方法,语是方法,语句句“stud.display( );”是消息。是消息。1-5.3 面向对象程序设计中的几个名词面向对象程序设计中的几个名词例例1-1 最简单的例子。最简单的例子。#include using namespace std;class Time /定义定义Time类类public: /数据成员为公用的数据成员为公用的 int hour; int minute; int

46、 sec;int main( ) Time t1; /定义定义t1为为Time类对象类对象cint1.hour; /输入设定的时间输入设定的时间cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.secendl; /输出时间输出时间return 0;1-6 类和对象的简单应用举例类和对象的简单应用举例例例1-2 引用多个对象的成员。引用多个对象的成员。(1) 程序程序(a)#include using namespace std;class Timepublic:int hour;int minute;int sec;int main( )Time

47、t1; /定义对象定义对象t1cint1.hour; /向向t1的数据成员输入数据的数据成员输入数据cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.sect2.hour; /向向t2的数据成员输入数据的数据成员输入数据cint2.minute;cint2.sec;coutt2.hour:t2.minute:t2.secendl; /输出输出t2中数据成员中数据成员的值的值return 0;(2) 程序程序(b)#include using namespace std;class Timepublic:int hour;int minute;int

48、 sec;int main( )void set_time(Time&); /函数声明函数声明void show_time(Time&); /函数声明函数声明Time t1; /定义定义t1为为Time类对象类对象set_time(t1); /调用调用set_time函数,向函数,向t1对象中的数据成员输入数据对象中的数据成员输入数据show_time(t1); /调用调用show_time函数,输出函数,输出t1对象中的数据对象中的数据Time t2; /定义定义t2为为Time类对象类对象set_time(t2); /调用调用set_time函数,向函数,向t2对象中的数据成员输入数据对象

49、中的数据成员输入数据show_time(t2); /调用调用show_time函数,输出函数,输出t2对象中的数据对象中的数据return 0;void set_time(Time& t) /定义函数定义函数set_time,形参形参t是引用变量是引用变量 cint.hour; /输入设定的时间输入设定的时间 cint.minute; cint.sec;void show_time(Time& t) /定义函数定义函数show_time,形参形参t是引用变量是引用变量 coutt.hour:t.minute:t.secendl; /输出对象中的数据输出对象中的数据(3) 程序程序(c)int

50、main( ) void set_time(Time&,int hour=0,int minute=0,int sec=0); /函数声明函数声明void show_time(Time&); /函数声明函数声明Time t1;set_time(t1,12,23,34); /通过实参传递时、分、秒的值通过实参传递时、分、秒的值show_time(t1);Time t2;set_time(t2); /使用默认的时、分、秒的值使用默认的时、分、秒的值show_time(t2);return 0;void set_time(Time& t,int hour,int minute,int sec) t.

51、hour=hour;t.minute=minute;t.sec=sec;void show_time(Time& t)coutt.hour:t.minute:t.secendl;例例1-3 改用含成员函数的类来处理。改用含成员函数的类来处理。#include using namespace std;class Timepublic:void set_time( ); /公用成员函数公用成员函数void show_time( ); /公用成员函数公用成员函数 private: /数据成员为私有数据成员为私有int hour;int minute;int sec;int main( )Time t

52、1; /定义对象定义对象t1 t1.set_time( ); /调用对象调用对象t1的成员函数的成员函数set_time,向向t1的数据成员输入数据的数据成员输入数据t1.show_time( ); /调用对象调用对象t1的成员函数的成员函数show_time,输出输出t1的数据成员的值的数据成员的值Time t2; /定义对象定义对象t2t2.set_time( ); /调用对象调用对象t2的成员函数的成员函数set_time,向向t2的数据成员输入数据的数据成员输入数据t2.show_time( ); /调用对象调用对象t2的成员函数的成员函数show_time,输出输出t2的数据成员的值

53、的数据成员的值return 0;void Time set_time( ) /在类外定义在类外定义set_time函数函数 cinhour; cinminute; cinsec;void Time show_time( ) /在类外定义在类外定义show_time函数函数 couthour:minute:secendl;注意:注意: (1) 在主函数中调用两个成员函数时,应指明对象名在主函数中调用两个成员函数时,应指明对象名(t1,t2)。表示调用的是哪一个对象的成员函数。表示调用的是哪一个对象的成员函数。(2) 在类外定义函数时,应指明函数的作用域在类外定义函数时,应指明函数的作用域(如如v

54、oid Time set_time( )。在成员函数引用本对象的数在成员函数引用本对象的数据成员时,只需直接写数据成员名,这时据成员时,只需直接写数据成员名,这时C+系统会系统会把它默认为本对象的数据成员。也可以显式地写出类把它默认为本对象的数据成员。也可以显式地写出类名并使用域运算符。名并使用域运算符。(3) 应注意区分什么场合用域运算符应注意区分什么场合用域运算符“ ”,什么场,什么场合用成员运算符合用成员运算符“.”,不要搞混。,不要搞混。例例1-4 找出一个整型数组中的元素的最大值。找出一个整型数组中的元素的最大值。#include using namespace std;class

55、Array_max /声明类声明类public: /以下以下3行为成员函数原型声明行为成员函数原型声明void set_value( ); /对数组元素设置值对数组元素设置值void max_value( ); /找出数组中的最大元素找出数组中的最大元素void show_value( ); /输出最大值输出最大值private:int array10; /整型数组整型数组int max; /max用来存放最大值用来存放最大值;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=max;int main( )Array_max arrmax; /定义对象定义对象arrmaxarrmax.set_value( ); arrmax.max_value( ); arrmax.show_value( ); return 0;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号