C语言PPT谭浩强教材配套版第15章.ppt





《C语言PPT谭浩强教材配套版第15章.ppt》由会员分享,可在线阅读,更多相关《C语言PPT谭浩强教材配套版第15章.ppt(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、15.1概述概述15.2类和对象类和对象15.3构造函数和析构函数构造函数和析构函数15.4继承与派生继承与派生第15章 C+的面向对象基础15.1 概述概述C+不仅扩充了不仅扩充了C面向过程的功能,而且增加了面向面向过程的功能,而且增加了面向对象的功能,这就使对象的功能,这就使C+成为能适应面向对象程序成为能适应面向对象程序设计的现代大型语言。设计的现代大型语言。C+不是简单地对不是简单地对C做了某做了某些改进,而是在些改进,而是在C成功的基础上进行了一场革命。成功的基础上进行了一场革命。赋予赋予C以新的生命力。以新的生命力。客观世界中任何一个事物都可以看成一个对象。或客观世界中任何一个事物
2、都可以看成一个对象。或者说,客观世界是由千千万万个对象组成的,它们者说,客观世界是由千千万万个对象组成的,它们之间通过一定的渠道相互联系,如图之间通过一定的渠道相互联系,如图15.1示意。在示意。在实际生活中,人们往往在一个对象中进行活动,或实际生活中,人们往往在一个对象中进行活动,或者说对象是进行活动的基本单位。作为对象,它应者说对象是进行活动的基本单位。作为对象,它应该至少有两个要素:一是从事活动的主体;二是活该至少有两个要素:一是从事活动的主体;二是活动的内容。要进行活动,或者是事先安排好一个活动的内容。要进行活动,或者是事先安排好一个活动计划,或者由外界临时通知。动计划,或者由外界临时
3、通知。图图15.1 图图15.2从计算机的角度看,一个对象应该包括两个要素:从计算机的角度看,一个对象应该包括两个要素:一是数据;二是需要进行的操作。对象就是一个包一是数据;二是需要进行的操作。对象就是一个包含数据以及与这些数据有关的操作的集合。图含数据以及与这些数据有关的操作的集合。图15.2 表示一个对象是由数据和操作代码组成的。表示一个对象是由数据和操作代码组成的。传统的面向过程程序设计是围绕功能进行的,用一传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。所有的数据都是公用的,一个函数实现一个功能。所有的数据都是公用的,一个函数可以使用任意一组数据,而一组数据又能被个函数
4、可以使用任意一组数据,而一组数据又能被多个函数所使用(见图多个函数所使用(见图15.3)。程序设计者必须考)。程序设计者必须考虑每一个细节,什么时候对什么数据进行操作。当虑每一个细节,什么时候对什么数据进行操作。当程序规模较大、数据很多、操作种类繁多时,程序程序规模较大、数据很多、操作种类繁多时,程序设计者往往感到难以应付。设计者往往感到难以应付。图图15.3面向对象程序设计采用新的思路。它面对的是一个面向对象程序设计采用新的思路。它面对的是一个个对象。所有的数据分别属于不同的对象。实际上,个对象。所有的数据分别属于不同的对象。实际上,每一组数据都是有特定的用途的,是某种操作的对每一组数据都是
5、有特定的用途的,是某种操作的对象。把相关的数据和操作放在一起,形成一个整体,象。把相关的数据和操作放在一起,形成一个整体,与外界相对分隔。面向对象程序设计方法的一个重与外界相对分隔。面向对象程序设计方法的一个重要特点就是要特点就是“封装性封装性”,把数据和操作代码封装,把数据和操作代码封装在一个对象中。程序设计者的任务包括两个方面:在一个对象中。程序设计者的任务包括两个方面:一是设计对象,即决定把哪些数据和操作封装在一一是设计对象,即决定把哪些数据和操作封装在一起;二是在此基础上怎样通知有关对象完成所需的起;二是在此基础上怎样通知有关对象完成所需的任务。这时他如同一个总调度,不断地向各个对象任
6、务。这时他如同一个总调度,不断地向各个对象发出命令,让这些对象活动起来,完成自己范围内发出命令,让这些对象活动起来,完成自己范围内的操作。各个对象的操作完成了,整体任务也就完的操作。各个对象的操作完成了,整体任务也就完成了。显然,对一个大型任务来说,面向对象程序成了。显然,对一个大型任务来说,面向对象程序设计方法将是十分有效的,它能大大降低程序设计设计方法将是十分有效的,它能大大降低程序设计人员的工作难度,减少出错机会。人员的工作难度,减少出错机会。15.2 类类 和和 对对 象象每一个实体都是对象。有一些对象是具有相同的结每一个实体都是对象。有一些对象是具有相同的结构和特性的。在构和特性的。
7、在C+中对象的类型称为中对象的类型称为“类类”(class)。类代表了某一批对象的共性和特征。类代表了某一批对象的共性和特征。可以说:类是对象的抽象,而对象是类的具体实例。可以说:类是对象的抽象,而对象是类的具体实例。正如同结构体类型和结构体变量的关系一样,人们正如同结构体类型和结构体变量的关系一样,人们先声明一个结构体类型,然后用它去定义结构体变先声明一个结构体类型,然后用它去定义结构体变量。同一个结构体类型可以定义出多个不同的结构量。同一个结构体类型可以定义出多个不同的结构体变量。在体变量。在C+中也是先声明一个中也是先声明一个“类类”类型,然类型,然后用它去定义若干个同类型的对象。对象就
8、是一个后用它去定义若干个同类型的对象。对象就是一个“类类”类型的变量。类是用来定义对象的一种抽象类型的变量。类是用来定义对象的一种抽象数据类型,或者说它是产生对象的模板。它的性质数据类型,或者说它是产生对象的模板。它的性质和其他数据类型(如整型、实型、枚举类型、结构和其他数据类型(如整型、实型、枚举类型、结构体类型)相同。在一开始时弄清对象和类的关系是体类型)相同。在一开始时弄清对象和类的关系是十分重要的。十分重要的。C+对对C的改进,最重要的就是增加了的改进,最重要的就是增加了“类类”这样一这样一种数据类型。所以种数据类型。所以C+开始时被称为开始时被称为“带类的带类的C”。所有面向对象的语
9、言都提供了这种数据类型。所有面向对象的语言都提供了这种数据类型。在在C+中怎样声明一个中怎样声明一个“类类”类型呢?其方法和声类型呢?其方法和声明一个结构体类型是相似的。下面是我们已熟悉的明一个结构体类型是相似的。下面是我们已熟悉的声明一个结构体类型:声明一个结构体类型:struct studentint num;char name10;char sex;struct student student1,student2;上面声明了一个名为上面声明了一个名为student的结构体类型并定义了的结构体类型并定义了两个结构体变量两个结构体变量student1和和student2。可以看到它。可以看到
10、它只包括数据(变量),没有包括操作。如果希望对只包括数据(变量),没有包括操作。如果希望对结构体变量中各成员赋值或输出它们的值,需要另结构体变量中各成员赋值或输出它们的值,需要另外编写有关的操作语句。结构体变量中各成员在本外编写有关的操作语句。结构体变量中各成员在本作用域中都是作用域中都是“敞开敞开”的,大家都可以用,而且不的,大家都可以用,而且不受任何限制。这就造成程序的不安全。现在我们声受任何限制。这就造成程序的不安全。现在我们声明一个类:明一个类:class stud/以以class开头开头int num;char name10;char sex;/以上以上3行是数据成员行是数据成员 v
11、oid display()/这是成员函数这是成员函数 coutnum:numendl;coutname:nameendl;coutsex:sexendl;/以上以上4行是操作代码行是操作代码;stud stud1,stud2;/定义了两个定义了两个stud 类的对象类的对象 这就声明了一个名为这就声明了一个名为stud的类。可以看到声明的类。可以看到声明“类类”的方法是由声明结构体类型的方法发展而来的。它的方法是由声明结构体类型的方法发展而来的。它除了包含数据部分以外,还包括了对这些数据的操除了包含数据部分以外,还包括了对这些数据的操作部分,也就是把数据和操作封装在一起。作部分,也就是把数据和
12、操作封装在一起。display是一个函数,用来输出本对象中学生的学是一个函数,用来输出本对象中学生的学号、姓名和性别。类除了具有封装性外,还采用了号、姓名和性别。类除了具有封装性外,还采用了信息隐蔽原则,使类中的成员与外界的联系减少到信息隐蔽原则,使类中的成员与外界的联系减少到最低限度。现在封装在最低限度。现在封装在stud中的成员都对外界隐蔽,中的成员都对外界隐蔽,外界不能调用它们。只有本类中的函数外界不能调用它们。只有本类中的函数display可可以调用同一类中的数据。以调用同一类中的数据。在本类中没有指定的操作一律不能执行。这当然安在本类中没有指定的操作一律不能执行。这当然安全了,但是谁
13、来通知执行全了,但是谁来通知执行display函数呢?它无法函数呢?它无法启动,缺少对外界的接口。因此,不能把全部成员启动,缺少对外界的接口。因此,不能把全部成员与外界隔离,一般是把数据隐蔽起来,而把成员函与外界隔离,一般是把数据隐蔽起来,而把成员函数作为对外界的接口,譬如可以从外界发出一个命数作为对外界的接口,譬如可以从外界发出一个命令,通知该对象执行令,通知该对象执行display函数,输出某一学生函数,输出某一学生的有关数据。的有关数据。类的成员包括两大类,一类是类的成员包括两大类,一类是“私有的私有的”(private),即外界不能调用;另一类是,即外界不能调用;另一类是“公用的公用的
14、”(public),有的书译为,有的书译为“公有的公有的”,即公开的,外界可以调,即公开的,外界可以调用(稍后还要介绍一类即用(稍后还要介绍一类即“受保护的受保护的”(protected)。可以将上面类的声明改为。可以将上面类的声明改为 class stud private:/声明以下部分为私有的声明以下部分为私有的 int num;char name10;char sex;public:/声明以下部分为公用的声明以下部分为公用的 void display()coutnum:numendl;coutname:nameendl;coutsex:sexendl;/以上以上4行是操作代码行是操作代码
15、;stud stud1,stud2;/定义了两个定义了两个stud 类的对象类的对象现在声明了现在声明了display函数是公用的,外界就可以调用函数是公用的,外界就可以调用该函数了。该函数了。如果在类的声明中既不指定如果在类的声明中既不指定private,也不指定,也不指定public,则系统就认为是私有的(第一次的类声明就属此,则系统就认为是私有的(第一次的类声明就属此情况)。情况)。顺便介绍在面向对象程序设计中的几个名词:类中顺便介绍在面向对象程序设计中的几个名词:类中的成员函数称为的成员函数称为“方法方法”,“方法方法”是对数据的是对数据的操作操作。一个。一个“方法方法”对应一种操作。
16、显然,只有被对应一种操作。显然,只有被声明为声明为public的方法(成员函数)才能被对象外界的方法(成员函数)才能被对象外界所激活。外界是通过发所激活。外界是通过发“消息消息”来激活有关方法的。来激活有关方法的。所谓所谓“消息消息”,其实就是一个,其实就是一个命令命令,由程序语句来,由程序语句来实现。例如想输出对象实现。例如想输出对象stud1中的学生学号、姓名、中的学生学号、姓名、性别等信息,可以在程序中写性别等信息,可以在程序中写stud1.display();这就是向对象这就是向对象stud1发出的一个发出的一个“消息消息”,通知它执,通知它执行行display“方法方法”(即(即di
17、splay函数)。在这里一个函数)。在这里一个语句中涉及到语句中涉及到3个术语:对象、方法和消息。个术语:对象、方法和消息。归纳以上对类型的声明,可以得到其一般形式:归纳以上对类型的声明,可以得到其一般形式:class 类名类名private:私有的数据和成员函数私有的数据和成员函数;public:公用的数据和成员函数公用的数据和成员函数;C+增加了增加了class类型后,仍保留了结构体类型类型后,仍保留了结构体类型(struct)和共用体类型和共用体类型(union),而且把它们的功,而且把它们的功能也扩展了,允许在声明的结构体和共用体类型中能也扩展了,允许在声明的结构体和共用体类型中包括成
18、员函数,也就是可以用包括成员函数,也就是可以用struct和和union来声明来声明一个类型。但它们和一个类型。但它们和class声明的类有所区别。声明的类有所区别。用用struct声明的类,如果不作声明的类,如果不作private或或public声明,声明,系统将其成员默认定为系统将其成员默认定为public(公用的),在需要(公用的),在需要时可以自己用显式声明重新指定为时可以自己用显式声明重新指定为private或或public。用用union声明的类,如果不作声明的类,如果不作private或或public声明,声明,系统将其成员默认定为系统将其成员默认定为public(公用的),且不
19、能(公用的),且不能改变。改变。用用class声明的类,如果不作声明的类,如果不作private或或public声明,系声明,系统将其成员默认定为统将其成员默认定为private(私有的),在需要(私有的),在需要时可以自己用显式声明改变。时可以自己用显式声明改变。15.3 构造函数和析构函数构造函数和析构函数15.3.1 构造函数构造函数在建立一个对象时,常常需要作某些初始化的工作在建立一个对象时,常常需要作某些初始化的工作(例如对数据赋予初值),(例如对数据赋予初值),C+提供了一种特殊的提供了一种特殊的成员函数成员函数构造函数构造函数(constructor)。这种函数。这种函数与其他成
20、员不同,不需要用户发与其他成员不同,不需要用户发“消息消息”来激活来激活它,而是在建立对象时自动执行。构造函数是由用它,而是在建立对象时自动执行。构造函数是由用户定义的,它必须与类名同名,以便系统能识别它户定义的,它必须与类名同名,以便系统能识别它并把它作为构造函数。现在我们在前面声明的类中并把它作为构造函数。现在我们在前面声明的类中加入构造函数。加入构造函数。class stud private:/声明以下部分为私有的声明以下部分为私有的 int num;char name10;char sex;public:stud()/定义构造函数,函数名与类名相同定义构造函数,函数名与类名相同 num
21、=10010;strcpy(name,Wang-li);sex=F;/以上以上3行为给数据赋初值行为给数据赋初值 void display()/定义成员函数定义成员函数 coutnum:numendl;coutname:nameendl;coutsex:sexendl;stud stud1;/在定义对象在定义对象stud1时自动执行构造函数时自动执行构造函数注意:注意:构造函数不需用户调用,而是在定义一个对象构造函数不需用户调用,而是在定义一个对象时由系统自动执行,而且只能执行一次。构造函数一时由系统自动执行,而且只能执行一次。构造函数一般声明为般声明为public,无返回值,也不需加,无返回
22、值,也不需加void类型声明。类型声明。现在写成一个完整的程序。现在写成一个完整的程序。例例15.1 建立一个对象,输出学生的学号、姓名、性别。建立一个对象,输出学生的学号、姓名、性别。#include#includevoid main()class stud /声明一个类声明一个类 private:/私有部分私有部分 int num;char name10;char sex;public:/公用部分公用部分 stud()/定义构造函数,函数名与类名相同定义构造函数,函数名与类名相同 num=10010;/给数据赋初值给数据赋初值 strcpy(name,Wang-li);sex=F;void
23、 display()/定义成定义成员函数,输出对象的数据员函数,输出对象的数据 coutnum:numendl;coutname:nameendl;coutsex:sexendl;stud stud1;/在定义对象在定义对象stud1时自动执行构造时自动执行构造函数函数stud1.display();/从对象外面调用从对象外面调用display函数函数可以看到整个程序很简单,它包括三部分:可以看到整个程序很简单,它包括三部分:声明声明一个类;一个类;定义一个对象;定义一个对象;向对象发出消息,向对象发出消息,执行对象中的成员函数执行对象中的成员函数display。在定义。在定义stud1对象对
24、象时自动执行了构造函数时自动执行了构造函数stud(),因此对象中的数据,因此对象中的数据成员均被赋了值。执行成员均被赋了值。执行display函数输出以下信息:函数输出以下信息:num:10010name:Wang-lisex:F在程序中可以看到只有对象中的函数才能引用本对在程序中可以看到只有对象中的函数才能引用本对象中的数据。如果在对象外面直接用象中的数据。如果在对象外面直接用coutstud1.num;企图输出学生的学号是不行的。由此可体会到类的企图输出学生的学号是不行的。由此可体会到类的特点。特点。如果要建立两个对象,分别对数据赋予初值,就不如果要建立两个对象,分别对数据赋予初值,就不
25、能这样定义构造函数能这样定义构造函数stud了,因为它会使两个学生了,因为它会使两个学生的初值相同,例如姓名都是的初值相同,例如姓名都是Wang-li。应该分别赋。应该分别赋予不同的初值。可将构造函数修改如下:予不同的初值。可将构造函数修改如下:stud(int n,char nam,char s)/定义构造函数,有形定义构造函数,有形参参 num=n;strcpy(name,nam);sex=s;此时数据的值不由构造函数此时数据的值不由构造函数stud确定,而是在调用此确定,而是在调用此函数时由实参传来。但应注意构造函数不同于一般函数时由实参传来。但应注意构造函数不同于一般的成员函数,不能这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 PPT 谭浩强 教材 配套 15

限制150内