第15章 C的面向对象基础ppt

上传人:pu****.1 文档编号:568258485 上传时间:2024-07-23 格式:PPT 页数:61 大小:178KB
返回 下载 相关 举报
第15章 C的面向对象基础ppt_第1页
第1页 / 共61页
第15章 C的面向对象基础ppt_第2页
第2页 / 共61页
第15章 C的面向对象基础ppt_第3页
第3页 / 共61页
第15章 C的面向对象基础ppt_第4页
第4页 / 共61页
第15章 C的面向对象基础ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《第15章 C的面向对象基础ppt》由会员分享,可在线阅读,更多相关《第15章 C的面向对象基础ppt(61页珍藏版)》请在金锄头文库上搜索。

1、勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.1概述概述15.2类和对象类和对象15.3构造函数和析构函数构造函数和析构函数15.4继承与派生继承与派生第15章 C+的面向对象基础娩钨掷苞揪厅琶耙苗墨伟切尉萄九援惜淘悸材福昨抿汤席莱杉嚼倒演认躯第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.1 概述概述C+不仅扩充了不仅扩充了C面向过程的功能,而且增加了面向面向过程的功能

2、,而且增加了面向对象的功能,这就使对象的功能,这就使C+成为能适应面向对象程序成为能适应面向对象程序设计的现代大型语言。设计的现代大型语言。C+不是简单地对不是简单地对C做了某做了某些改进,而是在些改进,而是在C成功的基础上进行了一场革命。成功的基础上进行了一场革命。赋予赋予C以新的生命力。以新的生命力。客观世界中任何一个事物都可以看成一个对象。或客观世界中任何一个事物都可以看成一个对象。或者说,客观世界是由千千万万个对象组成的,它们者说,客观世界是由千千万万个对象组成的,它们之间通过一定的渠道相互联系,如图之间通过一定的渠道相互联系,如图15.1示意。在示意。在实际生活中,人们往往在一个对象

3、中进行活动,或实际生活中,人们往往在一个对象中进行活动,或者说对象是进行活动的基本单位。作为对象,它应者说对象是进行活动的基本单位。作为对象,它应该至少有两个要素:一是从事活动的主体;二是活该至少有两个要素:一是从事活动的主体;二是活动的内容。要进行活动,或者是事先安排好一个活动的内容。要进行活动,或者是事先安排好一个活动计划,或者由外界临时通知。动计划,或者由外界临时通知。景及丢房倘哼涪串耕姓疽证憋樱颇浑硕刀箕画捂睦纯垄浦厂饯燥饭道赴慰第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第1

4、5章C的面向对象基础ppt图图15.1 图图15.2滴铸芋业梳雄佰糟掘摸即罗技保饮再殖篙轿掂恬擂够阎饺至碎兵本寿杨俱第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt从计算机的角度看,一个对象应该包括两个要素:从计算机的角度看,一个对象应该包括两个要素:一是数据;二是需要进行的操作。对象就是一个包一是数据;二是需要进行的操作。对象就是一个包含数据以及与这些数据有关的操作的集合。图含数据以及与这些数据有关的操作的集合。图15.2 表示一个对象是由数据和操作代码组成

5、的。表示一个对象是由数据和操作代码组成的。传统的面向过程程序设计是围绕功能进行的,用一传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。所有的数据都是公用的,一个函数实现一个功能。所有的数据都是公用的,一个函数可以使用任意一组数据,而一组数据又能被个函数可以使用任意一组数据,而一组数据又能被多个函数所使用(见图多个函数所使用(见图15.3)。程序设计者必须考)。程序设计者必须考虑每一个细节,什么时候对什么数据进行操作。当虑每一个细节,什么时候对什么数据进行操作。当程序规模较大、数据很多、操作种类繁多时,程序程序规模较大、数据很多、操作种类繁多时,程序设计者往往感到难以应付。设计者

6、往往感到难以应付。未身阑倔挽皇徐坤绿耸自猿痘龋岩恤冕婴散郸博求米吹咱蹬钓瘫凰僧世钡第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt图图15.3酌宅阅朗架旷驻特杜荡可呜咒尾俊夸蹦营绳家搞承捻贩挺坠革言陕冻鹊步第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt面向对象程序设计采用新的思路。它面对的是一个面向对象程序设计采用新的思路。

7、它面对的是一个个对象。所有的数据分别属于不同的对象。实际上,个对象。所有的数据分别属于不同的对象。实际上,每一组数据都是有特定的用途的,是某种操作的对每一组数据都是有特定的用途的,是某种操作的对象。把相关的数据和操作放在一起,形成一个整体,象。把相关的数据和操作放在一起,形成一个整体,与外界相对分隔。面向对象程序设计方法的一个重与外界相对分隔。面向对象程序设计方法的一个重要特点就是要特点就是“封装性封装性” ,把数据和操作代码封装,把数据和操作代码封装在一个对象中。程序设计者的任务包括两个方面:在一个对象中。程序设计者的任务包括两个方面:一是设计对象,即决定把哪些数据和操作封装在一一是设计对象

8、,即决定把哪些数据和操作封装在一起;二是在此基础上怎样通知有关对象完成所需的起;二是在此基础上怎样通知有关对象完成所需的任务。这时他如同一个总调度,不断地向各个对象任务。这时他如同一个总调度,不断地向各个对象发出命令,让这些对象活动起来,完成自己范围内发出命令,让这些对象活动起来,完成自己范围内的操作。各个对象的操作完成了,整体任务也就完的操作。各个对象的操作完成了,整体任务也就完成了。显然,对一个大型任务来说,面向对象程序成了。显然,对一个大型任务来说,面向对象程序设计方法将是十分有效的,它能大大降低程序设计设计方法将是十分有效的,它能大大降低程序设计人员的工作难度,减少出错机会。人员的工作

9、难度,减少出错机会。 灌亿顿职迟纵靖帛判辆艾拇爬禄勋轧申吼种朝搭汾寻放箕诗湘猾掇稠掂见第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.2 类类 和和 对对 象象每一个实体都是对象。有一些对象是具有相同的结每一个实体都是对象。有一些对象是具有相同的结构和特性的。在构和特性的。在C+中对象的类型称为中对象的类型称为“类类”(class) 。类代表了某一批对象的共性和特征。类代表了某一批对象的共性和特征。可以说:类是对象的抽象,而对象是类的具体实例。可以说:类

10、是对象的抽象,而对象是类的具体实例。正如同结构体类型和结构体变量的关系一样,人们正如同结构体类型和结构体变量的关系一样,人们先声明一个结构体类型,然后用它去定义结构体变先声明一个结构体类型,然后用它去定义结构体变量。同一个结构体类型可以定义出多个不同的结构量。同一个结构体类型可以定义出多个不同的结构体变量。在体变量。在C+中也是先声明一个中也是先声明一个“类类”类型,然类型,然后用它去定义若干个同类型的对象。对象就是一个后用它去定义若干个同类型的对象。对象就是一个“类类”类型的变量。类是用来定义对象的一种抽象类型的变量。类是用来定义对象的一种抽象数据类型,或者说它是产生对象的模板。它的性质数据

11、类型,或者说它是产生对象的模板。它的性质和其他数据类型(如整型、实型、枚举类型、结构和其他数据类型(如整型、实型、枚举类型、结构体类型)相同。在一开始时弄清对象和类的关系是体类型)相同。在一开始时弄清对象和类的关系是十分重要的。十分重要的。塔弊状氟阑复挣久胆嘴岭铬茂私没鄙亩择帝括秀讼浓饭讳圣颂孽檄愁捏颅第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础pptC+对对C的改进,最重要的就是增加了的改进,最重要的就是增加了“类类” 这样一这样一种数据类型。所以种数据类型。

12、所以C+开始时被称为开始时被称为“带类的带类的C”。所有面向对象的语言都提供了这种数据类型。所有面向对象的语言都提供了这种数据类型。在在C+中怎样声明一个中怎样声明一个“类类”类型呢?其方法和声类型呢?其方法和声明一个结构体类型是相似的。下面是我们已熟悉的明一个结构体类型是相似的。下面是我们已熟悉的声明一个结构体类型:声明一个结构体类型:struct studentint num; char name10; char sex ; ;struct student student1,student2;洪算淄寡述辨充救浊伴三亭蹋场咆气拐硅客浑茂娟陵夕无雪意藕鞭苞炼蜘第15章C的面向对象基础ppt第1

13、5章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt上面声明了一个名为上面声明了一个名为student的结构体类型并定义了的结构体类型并定义了两个结构体变量两个结构体变量student1和和student2。可以看到它。可以看到它只包括数据(变量),没有包括操作。如果希望对只包括数据(变量),没有包括操作。如果希望对结构体变量中各成员赋值或输出它们的值,需要另结构体变量中各成员赋值或输出它们的值,需要另外编写有关的操作语句。结构体变量中各成员在本外编写有关的操作语句。结构体变量中各成员在本作用域中

14、都是作用域中都是“敞开敞开”的,大家都可以用,而且不的,大家都可以用,而且不受任何限制。这就造成程序的不安全。现在我们声受任何限制。这就造成程序的不安全。现在我们声明一个类:明一个类:class stud/以以class开头开头int num; char name10; char sex ; /以上以上3行是数据成员行是数据成员 void display( ) /这是成员函数这是成员函数 coutnum:numendl;精糜泌毙兜凰赛洒耿刽吞苍丙湾吕竟坊揽还钳攘辙卡师报糖专锦铲醚泳鳖第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕

15、闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt coutname:nameendl; coutsex:sexendl; /以上以上4行是操作代码行是操作代码;stud stud1,stud2; /定义了两个定义了两个stud 类的对象类的对象 这就声明了一个名为这就声明了一个名为stud的类。可以看到声明的类。可以看到声明“类类”的方法是由声明结构体类型的方法发展而来的。它的方法是由声明结构体类型的方法发展而来的。它除了包含数据部分以外,还包括了对这些数据的操除了包含数据部分以外,还包括了对这些数据的操作部分,也就是把数据和操作封装在一起。作部分,也就是把数据和操作封

16、装在一起。display是一个函数,用来输出本对象中学生的学是一个函数,用来输出本对象中学生的学号、姓名和性别。类除了具有封装性外,还采用了号、姓名和性别。类除了具有封装性外,还采用了信息隐蔽原则,使类中的成员与外界的联系减少到信息隐蔽原则,使类中的成员与外界的联系减少到最低限度。现在封装在最低限度。现在封装在stud中的成员都对外界隐蔽,中的成员都对外界隐蔽,外界不能调用它们。只有本类中的函数外界不能调用它们。只有本类中的函数display可可以调用同一类中的数据。以调用同一类中的数据。绚豪萍牲联浩钠尔监伺塞猾昭豪围航棘新欣蔫羚罪喧哭嫌复绍阁委郡敖嘎第15章C的面向对象基础ppt第15章C的

17、面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt在本类中没有指定的操作一律不能执行。这当然安在本类中没有指定的操作一律不能执行。这当然安全了,但是谁来通知执行全了,但是谁来通知执行display函数呢?它无法函数呢?它无法启动,缺少对外界的接口。因此,不能把全部成员启动,缺少对外界的接口。因此,不能把全部成员与外界隔离,一般是把数据隐蔽起来,而把成员函与外界隔离,一般是把数据隐蔽起来,而把成员函数作为对外界的接口,譬如可以从外界发出一个命数作为对外界的接口,譬如可以从外界发出一个命令,通知该对象执行令

18、,通知该对象执行display函数,输出某一学生函数,输出某一学生的有关数据。的有关数据。类的成员包括两大类,一类是类的成员包括两大类,一类是“私有的私有的”(private),即外界不能调用;另一类是,即外界不能调用;另一类是“公用的公用的”(public) ,有的书译为,有的书译为“公有的公有的”,即公开的,外界可以调,即公开的,外界可以调用(稍后还要介绍一类即用(稍后还要介绍一类即“受保护的受保护的”(protected)。可以将上面类的声明改为。可以将上面类的声明改为邀称请迭恩竹啄积第诺咬枢曾绒胀铜袍拆引病糠便寺勇胰忧锡描黄棉废扁第15章C的面向对象基础ppt第15章C的面向对象基础p

19、pt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt class stud private: /声明以下部分为私有的声明以下部分为私有的 int num; char name10; char sex ; public: /声明以下部分为公用的声明以下部分为公用的 void display( ) coutnum:numendl; coutname:nameendl; coutsex:sexendl; /以上以上4行是操作代码行是操作代码; stud stud1,stud2; /定义了两个定义了两个stud 类的对象类的对

20、象现在声明了现在声明了display函数是公用的,外界就可以调用函数是公用的,外界就可以调用该函数了。该函数了。奉悸舅串庞眼胞霸备醒瓶菊导仆萌絮噶鸟灿扒肩业厄涂砾腮搜打骆功虞涩第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt如果在类的声明中既不指定如果在类的声明中既不指定private,也不指定,也不指定public,则系统就认为是私有的(第一次的类声明就属此,则系统就认为是私有的(第一次的类声明就属此情况)。情况)。顺便介绍在面向对象程序设计中的几个名词:类

21、中顺便介绍在面向对象程序设计中的几个名词:类中的成员函数称为的成员函数称为“方法方法”, “方法方法”是对数据的是对数据的操作操作。一个。一个“方法方法”对应一种操作。显然,只有被对应一种操作。显然,只有被声明为声明为public的方法(成员函数)才能被对象外界的方法(成员函数)才能被对象外界所激活。外界是通过发所激活。外界是通过发“消息消息”来激活有关方法的。来激活有关方法的。所谓所谓“消息消息”,其实就是一个,其实就是一个命令命令,由程序语句来,由程序语句来实现。例如想输出对象实现。例如想输出对象stud1中的学生学号、姓名、中的学生学号、姓名、性别等信息,可以在程序中写性别等信息,可以在

22、程序中写stud1.display( );这就是向对象这就是向对象stud1发出的一个发出的一个“消息消息”,通知它执,通知它执行行display“方法方法”(即(即display函数)。在这里一个函数)。在这里一个语句中涉及到语句中涉及到3个术语:对象、方法和消息。个术语:对象、方法和消息。跳类廉孟古割庐拦哦舱畜糕罐澜践倪寸牡娄痈莲私冀澜近霓譬拣体码筒方第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt归纳以上对类型的声明,可以得到其一般形式:归纳以上对类型的

23、声明,可以得到其一般形式:class 类名类名private :私有的数据和成员函数私有的数据和成员函数; public:公用的数据和成员函数公用的数据和成员函数;C+增加了增加了class类型后,仍保留了结构体类型类型后,仍保留了结构体类型(struct)和共用体类型和共用体类型(union),而且把它们的功,而且把它们的功能也扩展了,允许在声明的结构体和共用体类型中能也扩展了,允许在声明的结构体和共用体类型中包括成员函数,也就是可以用包括成员函数,也就是可以用struct和和union来声明来声明一个类型。但它们和一个类型。但它们和class声明的类有所区别。声明的类有所区别。以蹄刹形卷粹

24、扶亏供掷硫尝吝缅醛母云凌倾十叮艰众薯揭妻格摇骡糊栓雍第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt用用struct声明的类,如果不作声明的类,如果不作private或或public声明,声明,系统将其成员默认定为系统将其成员默认定为public(公用的),在需要(公用的),在需要时可以自己用显式声明重新指定为时可以自己用显式声明重新指定为private或或public。用用union声明的类,如果不作声明的类,如果不作private或或public声明,声明

25、,系统将其成员默认定为系统将其成员默认定为public(公用的),且不能(公用的),且不能改变。改变。用用class声明的类,如果不作声明的类,如果不作private或或public声明,系声明,系统将其成员默认定为统将其成员默认定为private(私有的),在需要(私有的),在需要时可以自己用显式声明改变。时可以自己用显式声明改变。简想密接令镀评鳖搬卡篷宝娜剪拎篓丹芦羊姐发概送连适住穗退袖骇剿宠第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.3 构造函

26、数和析构函数构造函数和析构函数15.3.1 构造函数构造函数在建立一个对象时,常常需要作某些初始化的工作在建立一个对象时,常常需要作某些初始化的工作(例如对数据赋予初值),(例如对数据赋予初值),C+提供了一种特殊的提供了一种特殊的成员函数成员函数构造函数构造函数(constructor) 。这种函数。这种函数与其他成员不同,不需要用户发与其他成员不同,不需要用户发“消息消息” 来激活来激活它,而是在建立对象时自动执行。构造函数是由用它,而是在建立对象时自动执行。构造函数是由用户定义的,它必须与类名同名,以便系统能识别它户定义的,它必须与类名同名,以便系统能识别它并把它作为构造函数。现在我们在

27、前面声明的类中并把它作为构造函数。现在我们在前面声明的类中加入构造函数。加入构造函数。class stud private: /声明以下部分为私有的声明以下部分为私有的 int num; char name10; char sex ; 咯阂峪篆踞友赊睛妆哈耸柯肌滑枪炬蕴百各逛吗绳缘斜酱钞釜缠缩贵沈农第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础pptpublic: stud( ) /定义构造函数,函数名与类名相同定义构造函数,函数名与类名相同 num=10010;

28、 strcpy(name,Wang-li); sex=F; /以上以上3行为给数据赋初值行为给数据赋初值 void display( ) /定义成员函数定义成员函数 coutnum:numendl; coutname:nameendl; coutsex:sexendl; ;stud stud1; /在定义对象在定义对象stud1时自动执行构造函数时自动执行构造函数注意:注意: 构造函数不需用户调用,而是在定义一个对象构造函数不需用户调用,而是在定义一个对象时由系统自动执行,而且只能执行一次。构造函数一时由系统自动执行,而且只能执行一次。构造函数一般声明为般声明为public,无返回值,也不需加

29、,无返回值,也不需加void类型声明。类型声明。现在写成一个完整的程序。现在写成一个完整的程序。籍潜砷薛昭硼掀哩帆闻范彭卡跃嗣操颊髓奢抛荆枫频导庐艘朝冤乳握已咀第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt例例15.1 建立一个对象,输出学生的学号、姓名、性别。建立一个对象,输出学生的学号、姓名、性别。#include#includevoid main( ) class stud /声明一个类声明一个类 private: /私有部分私有部分 int num;

30、 char name10; char sex ; public: /公用部分公用部分 stud( ) /定义构造函数,函数名与类名相同定义构造函数,函数名与类名相同 num=10010; /给数据赋初值给数据赋初值 strcpy(name,Wang-li); sex=F; void display( ) /定义成定义成员函数,输出对象的数据员函数,输出对象的数据柳欧提抡浅爱鳖共遮以擞寞韶雕饮恬授很术崎谁挣甸察咆雀暑怎疗拳炮僳第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对

31、象基础ppt coutnum: numendl; coutname: nameendl; coutsex: sexendl; ;stud stud1; /在定义对象在定义对象stud1时自动执行构造时自动执行构造函数函数stud1.display( ); /从对象外面调用从对象外面调用display函数函数可以看到整个程序很简单,它包括三部分:可以看到整个程序很简单,它包括三部分: 声明声明一个类;一个类; 定义一个对象;定义一个对象; 向对象发出消息,向对象发出消息,执行对象中的成员函数执行对象中的成员函数display。在定义。在定义stud1对象对象时自动执行了构造函数时自动执行了构造函

32、数stud( ),因此对象中的数据,因此对象中的数据成员均被赋了值。执行成员均被赋了值。执行display函数输出以下信息:函数输出以下信息:冒萌期磨暴以勤膀帕蓟教凤堂负皇龚量傈惠棍仓钢致柬挎浅磺孩州坛栏乌第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础pptnum: 10010name: Wang-lisex: F在程序中可以看到只有对象中的函数才能引用本对在程序中可以看到只有对象中的函数才能引用本对象中的数据。如果在对象外面直接用象中的数据。如果在对象外面直接用

33、coutstud1.num ;企图输出学生的学号是不行的。由此可体会到类的企图输出学生的学号是不行的。由此可体会到类的特点。特点。如果要建立两个对象,分别对数据赋予初值,就不如果要建立两个对象,分别对数据赋予初值,就不能这样定义构造函数能这样定义构造函数stud了,因为它会使两个学生了,因为它会使两个学生的初值相同,例如姓名都是的初值相同,例如姓名都是Wang-li。应该分别赋。应该分别赋予不同的初值。可将构造函数修改如下:予不同的初值。可将构造函数修改如下:译春袱酋辞搁痕勇才釉绚希才拜栅捻胸贪梗壤垛丑废瘟瘟怠镜雾皑疙兵枝第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝

34、粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础pptstud(int n,char nam,char s ) /定义构造函数,有形定义构造函数,有形参参 num=n; strcpy(name, nam); sex=s; 此时数据的值不由构造函数此时数据的值不由构造函数stud确定,而是在调用此确定,而是在调用此函数时由实参传来。但应注意构造函数不同于一般函数时由实参传来。但应注意构造函数不同于一般的成员函数,不能这样调用:的成员函数,不能这样调用:stud1.stud(10010,“Wang-li”,f); /企图用调用一般成企图用调

35、用一般成员函数的方法来调用构造函数员函数的方法来调用构造函数前已说明构造函数是在建立对象时调用的,因此实前已说明构造函数是在建立对象时调用的,因此实参应该在建立对象时给出。如:参应该在建立对象时给出。如:stud stud1(10010, Wang-li, f), stud2(10011, Zhang-fun, m);悠诌渝矗险慨征言舌迂孕沦仰栋须级亭诅农沥公闺眼药惯仿裁赌彰瑶弃庚第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt现在定义了两个对象现在定义了两个

36、对象stud1和和stud2,它们的数据初值,它们的数据初值是不同的。如果想分别输出两个学生的数据,可以是不同的。如果想分别输出两个学生的数据,可以用以下的语句:用以下的语句:stud1.display( );stud2.display( );此时的输出如下:此时的输出如下:num: 10010name: Wang-lisex: fnum: 10011name: Zhang-funsex: m用户也可以不定义构造函数,编译系统会自动生成用户也可以不定义构造函数,编译系统会自动生成一个构造函数,该函数没有参数,不进行任何操作。一个构造函数,该函数没有参数,不进行任何操作。构造函数也可以重载,下面

37、是两个重载函数:构造函数也可以重载,下面是两个重载函数:巩丽栅坝桂倦贿蔚报援鳃访亿野核潞痈赔更洞赊荡懊澈融治报炯证本否洪第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础pptstud( ) /在构造函数中对数据赋初值在构造函数中对数据赋初值 num=10010; strcpy(name,Wang-li); sex=F; stud(int n,char nam,char s ) /有形参,由实有形参,由实参将值传给形参参将值传给形参 num=n; strcpy(nam

38、e, nam); sex=s; 在定义对象时允许有实参和无实参。如:在定义对象时允许有实参和无实参。如:stud stud1; /不带实参,数据初值在构造函数中不带实参,数据初值在构造函数中指定指定stud stud2(10011, Zhang-fun, m); /带实参,数据带实参,数据初值由实参给出初值由实参给出京婴揣哀凿名宣拘呢戚谬鬼腋捅诊半柯养娄队若瓶乔隆艘胸卉慌舀厄筋胆第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.3.2 析构函数析构函数析构

39、函数析构函数(destructor) 与构造函数相反,当对象脱与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做系统自动执行析构函数。析构函数往往用来做“清清理善后理善后” 的工作(例如在建立对象时用的工作(例如在建立对象时用new开辟了开辟了一片内存空间,应在退出前在析构函数中用一片内存空间,应在退出前在析构函数中用delete释放)。释放)。析构函数名也应与类名相同,只是在函数名前面加析构函数名也应与类名相同,只是在函数名前面加一个波浪符一个波浪符,例如,例如stud( ),以区别于构

40、造函数。,以区别于构造函数。它不能带任何参数,也没有返回值(包括它不能带任何参数,也没有返回值(包括void类型)类型)。只能有一个析构函数,不能重载。如果用户没有。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类构函数,它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。中没有用显式的析构函数。蒜峭瞪彼立壁栗固襄那鄙苗菜才蛹鸽蜗婶选痈寐痘青助砚弛间惫革苦据飘第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南

41、控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt例例15.2 包含构造函数和析构函数的包含构造函数和析构函数的C+程序。程序。#include#includeclass stud /声明一个类声明一个类 private: / 私有部分私有部分 int num; char name10; char sex ; public: /公用部分公用部分 stud(int n,char nam,char s ) /构造函数构造函数 num=n; strcpy(name, nam); sex=s; stud( ) /析构函数析构函数 蟹痒郝砷迅脏捍镀矛懦纷楼聊恕却羽孝侣啸讼簿

42、围厦座塔范陈斩戊敏受遁第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt void display( ) /成员函数,输出对象的数据成员函数,输出对象的数据 coutnum: numendl; coutname: nameendl; coutsex: sexendl; ;void main( ) stud stud1(10010, Wang-li, f), stud2(10011, Zhang-fun, m); /建立两个对象建立两个对象 stud1.displ

43、ay( ); /输出学生输出学生1的数据的数据 stud2.display( ); /输出学生输出学生2的数据的数据晶夜碗鞘力刁星酣酷稼斑嗡卜洽齐惺冬啼腻呼犁悉恭缆牌凝颊舍既沸氛逸第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt现在把类的声明放在现在把类的声明放在main函数之前,它的作用域是函数之前,它的作用域是全局的。这样做可以使全局的。这样做可以使main函数更简练一些。在函数更简练一些。在main函数中定义了两个对象并且给出了初值。然函数中定义了两个对

44、象并且给出了初值。然后输出两个学生的数据。运行结果和例后输出两个学生的数据。运行结果和例15.1中给出中给出的相同。在本例中,析构函数并无任何实质上的作的相同。在本例中,析构函数并无任何实质上的作用,我们把它写出来,只是为了说明析构函数的使用,我们把它写出来,只是为了说明析构函数的使用方法。用方法。在本程序中,成员函数是在类中定义的,如果成员在本程序中,成员函数是在类中定义的,如果成员函数的数目很多以及函数的长度很长,类的声明就函数的数目很多以及函数的长度很长,类的声明就会占很大的篇幅,不利于阅读程序。可以在类的外会占很大的篇幅,不利于阅读程序。可以在类的外面定义成员函数,而在类中只用函数的原

45、型作声明。面定义成员函数,而在类中只用函数的原型作声明。贯外擞妻潦泛愉哈蟹掳伙蒂茫扩喷笋赢性戒盛佯乞韭匈凡塌炽狡怒膏滴瘁第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt例例15.3 在类的外面定义成员函数。在类的外面定义成员函数。#include#includeclass stud/声明一个类声明一个类 private: int num; char name10; char sex ; public: stud(int n,char nam,char s )

46、; /对构造函数的原型对构造函数的原型声明声明 stud( ); /对析构函数的原型声明对析构函数的原型声明 void display( ) ; /对成员函数对成员函数display的原型声明的原型声明 ; stud stud(int n,char nam,char s ) /对构造函数对构造函数的定义的定义卫垮葬诗翘剿夯弓胳勇插伪掀暗凝恿万矗吱诵胖聚觉倒缨驴氰龋拼昭耸秦第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt num=n; strcpy(name,

47、nam); sex=s; stud stud( ) /对析构函数的定义对析构函数的定义 void stud display( ) /对成员函数对成员函数display的定义的定义 coutnum: numendl; coutname: nameendl; coutsex: sexendl; void main( ) stud stud1(10010, Wang-li, f), stud2(10011, Zhang-fun, m); stud1.display( ); /输出学生输出学生1的数据的数据 stud2.display( ); /输出学生输出学生2的数据的数据 渠唐兜冬蹬邢警絮烘忌恼忘

48、酣妈栋雪株蹦峰赤岳反宅是溃郭窗玻圭定闻蛀第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt请读者注意在类声明的外部定义函数,必须指定类请读者注意在类声明的外部定义函数,必须指定类名。函数首行的形式为名。函数首行的形式为函数类型函数类型 类名类名 函数名(形参表列)函数名(形参表列)不能写成不能写成void display( ) /未指定类名未指定类名如果这样写,编译系统会把它作为普通的函数处理,如果这样写,编译系统会把它作为普通的函数处理,而不作为类中的成员函数

49、。也不要写成:而不作为类中的成员函数。也不要写成:stud void display( ) /函数类型位置不函数类型位置不对对stud display( ) 是一个整体,说明是是一个整体,说明是stud类中的类中的display函数。不能把函数。不能把stud 和和display( ) 分隔开来。分隔开来。棋淖瓷淘奢牟驹爆昆粳阵猪挞瞪脾找痉纱醛稽尖纪婶殊蹋殊别编毋要患棕第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt虽然函数在类的外部定义,但在调用成员函数时会

50、虽然函数在类的外部定义,但在调用成员函数时会根据类中函数的原型声明找到函数的定义(函数代根据类中函数的原型声明找到函数的定义(函数代码),从而执行该函数。码),从而执行该函数。也可以将在类外部定义的函数声明为也可以将在类外部定义的函数声明为“内置函数内置函数”, 这样在编译时就将函数代码代入到类中的函数这样在编译时就将函数代码代入到类中的函数调用处,以提高程序执行效率。只需在函数定义的调用处,以提高程序执行效率。只需在函数定义的首行最左端加上首行最左端加上inline即可。如:即可。如:inline void stud display( )烃鞋灶目文蟹俏俄绞淘蕉醚耕刘赋刷锑无吃硝睦辙膘椿钮务巧

51、晃募扎扣凑第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.4 继继 承承 与与 派派 生生15.4.1 继承与派生的概念继承与派生的概念面向对象技术强调软件的可重用性。在面向对象技术强调软件的可重用性。在C+中可重中可重用性是通过用性是通过“继承继承” 这一机制来实现的。因此,这一机制来实现的。因此,继承是继承是C+的一重要组成部分。的一重要组成部分。前面介绍了类,一个类中包含了若干数据成员和成前面介绍了类,一个类中包含了若干数据成员和成员函数。每一个类

52、的数据成员和成员函数是不相同员函数。每一个类的数据成员和成员函数是不相同的。但有时两个类的内容基本相同或有一部分相同。的。但有时两个类的内容基本相同或有一部分相同。例如前面我们声明了学生基本数据的类例如前面我们声明了学生基本数据的类stud:穗孽脱碗身薄伙们爷景令良亢店绅捏古址淮疲贱歌亢愤行扯葫大径盟钧鹅第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础pptclass studprivate : int num; char name10; char sex; pub

53、lic: void display( ) /对成员函数对成员函数display的定义的定义 coutnum: numendl; coutname: nameendl; coutsex: sexendl; ;如果学校的某部门除了需要用到学号、姓名、性别如果学校的某部门除了需要用到学号、姓名、性别以外,还需要用到年龄、地址等信息。当然可以重以外,还需要用到年龄、地址等信息。当然可以重新声明另一个类:新声明另一个类:及硝臃递壤蚁揉原参汁突然花鹰酞柿掀露媒现渴萨弛横济眶祝玻判褥晶招第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲

54、群第15章C的面向对象基础ppt第15章C的面向对象基础pptclass stud 1private : int num; /此行原来己有此行原来己有 char name10; /此行原来己有此行原来己有 char sex; /此行原来己有此行原来己有 int age; char addr20; public: void display( ) ; /此行原来己有此行原来己有 coutnum: numendl; /此行原来己有此行原来己有 coutname: nameendl; /此行原来己有此行原来己有 coutsex: sexendl; /此行原来己有此行原来己有 coutage: agee

55、ndl; coutaddress: addrendl; ;恃说灌砷似谓梳愤谐土涕鹃饺她她附默鹤豫螺藤焚荤抉贱庄截硝而异稗炽第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt可以看到有相当一部分是原来已有的。很多人自然可以看到有相当一部分是原来已有的。很多人自然会想到能否利用原有声明的类作为基础,再加上新会想到能否利用原有声明的类作为基础,再加上新的内容即可,以减少重复的工作量。的内容即可,以减少重复的工作量。 C+提供的提供的“继承继承” 机制就是为了解决这个问

56、题。机制就是为了解决这个问题。举一个日常生活中的例子。如果已经定义了举一个日常生活中的例子。如果已经定义了“马马”的特征,现在需要说明什么是的特征,现在需要说明什么是“公马公马” ,只需在,只需在“马马”的特征的基础上增加的特征的基础上增加“雄性雄性”这一特征即可,这一特征即可,不必从头说明什么是马。如果想进一步说明什么是不必从头说明什么是马。如果想进一步说明什么是“白色的公马白色的公马”, 只需在只需在“公马公马”的基础上再增的基础上再增加说明加说明“颜色是白的颜色是白的”即可。也就是说:即可。也就是说:“公马公马”继承了继承了“马马”的全部特征,加上的全部特征,加上“雄性雄性”的新特征。的

57、新特征。“白公马白公马” 继承了继承了“公马公马”的全部特征,再增加的全部特征,再增加“白色白色”的特征。而的特征。而“公马公马”是是“马马” 派生出来派生出来的一个分支,的一个分支,“白公马白公马” 是是“公马公马” 派生出来的派生出来的一个分支。见图一个分支。见图15.4示意。示意。肥嫌累侮通痊晴秘差隋哎主矫例掇搔耐里诛玲烦拦洲记粱伪茁摊皿乏戈醛第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt在在C+中所谓中所谓“继承继承” 就是在一个已存在的类的基就是在

58、一个已存在的类的基础上建立一个新的类。已存在的类(好比础上建立一个新的类。已存在的类(好比“马马”)称为称为“基类基类” 或或“父类父类” 。新建立的类称为。新建立的类称为“派派生类生类” 或或“子类子类”。 见图见图15.5示意。示意。 派生类继承派生类继承了基类的所有数据成员和成员函数,并增加新的成了基类的所有数据成员和成员函数,并增加新的成员。员。图图15.4 图图15.5琳全巨傻傀彭肉肘病捧蕴抄细僵膳萌强亚贝搽捎玄阳碾韵俺广伏梦姜荚掐第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt

59、第15章C的面向对象基础ppt15.4.2 建立派生类的方法建立派生类的方法先通过一个例子说明怎样通过继承来建立派生类。先通过一个例子说明怎样通过继承来建立派生类。例例15.4通过继承来建立派生类。通过继承来建立派生类。假设已经声明了一个基类假设已经声明了一个基类stud(见前面的介绍),在(见前面的介绍),在此基础上声明一个派生类此基础上声明一个派生类student:class student: public stud /声明基类是声明基类是stud private: int age; /新增加的数据成员新增加的数据成员 char addr30; /新增加的数据成员新增加的数据成员 publ

60、ic: void display-1( ) /新增加的成员函数新增加的成员函数 coutage: ageendl; coutaddress: addrendl; ; 墨讣以署昼姑施霍驮动考扼叼赵寅陋朱娩识漳询瓜马寂肥鹃壳鹊绽盯全住第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt仔细观察第一行仔细观察第一行:class student: public stud 在在class后面的后面的student是新建的类名。冒号后面的是新建的类名。冒号后面的stud表示是

61、已存在的基类。在表示是已存在的基类。在stud之前有一关键字之前有一关键字public,用来表示基类,用来表示基类stud中的成员在派生类中的成员在派生类student中的使用权限。基类名前面有中的使用权限。基类名前面有public的称为的称为“公用派生类公用派生类”。其含义将在稍后讨论。其含义将在稍后讨论。请仔细阅读以上声明的派生类请仔细阅读以上声明的派生类student和上一节中给和上一节中给出的基类出的基类stud,并将它们放在一起进行分析。,并将它们放在一起进行分析。定义派生类的一般形式为定义派生类的一般形式为寒狂戎赶入级侧揽庞旧倾陶泛侠馋五贩缚捞羡蛤地磁豆燥猫卧乐鲤士萧龄第15章C的

62、面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础pptclass 派生类名派生类名: 引用权限引用权限 基类名基类名 派生类新增加的数据成员派生类新增加的数据成员 派生类新增加的成员函数派生类新增加的成员函数 ;“引用权限引用权限”可以是可以是private和和public。默认为。默认为private。派生类包括基类成员和自己增加的成员,派生类的派生类包括基类成员和自己增加的成员,派生类的成员函数在引用派生类自己的数据成员时,按前面成员函数在引用派生类自己的数据成员时,按前面

63、介绍过的规则处理(即私有数据成员只能被同一类介绍过的规则处理(即私有数据成员只能被同一类中的成员函数引用,公用成员可以被外界引用)。中的成员函数引用,公用成员可以被外界引用)。而对从基类继承来的成员的引用并不是简单地把基而对从基类继承来的成员的引用并不是简单地把基类的私有成员和公用成员直接作为派生类的私有成类的私有成员和公用成员直接作为派生类的私有成员和公用成员,而要根据基类成员的引用权限和派员和公用成员,而要根据基类成员的引用权限和派生类声明的引用权限共同决定。下面将分别介绍。生类声明的引用权限共同决定。下面将分别介绍。弊鳖漏渊湾镐骗码囱婪类周修又咸牙辽叛嚼蓄涨剑解凹框负貌幻热办防换第15章

64、C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.4.3 公用派生类公用派生类在声明一个派生类时将基类的引用权限指定为在声明一个派生类时将基类的引用权限指定为public的,该类称为基类的公用派生类。的,该类称为基类的公用派生类。在公用派生类中,基类的公用成员和保护在公用派生类中,基类的公用成员和保护(protected)成员仍然成为派生类中的公用成员和成员仍然成为派生类中的公用成员和保护成员保护成员(关于保护成员将在关于保护成员将在15.4.5节介绍节介绍),而

65、基,而基类的私有成员不能被派生类引用,即成为派生类类的私有成员不能被派生类引用,即成为派生类“不可访问的成员不可访问的成员”,只有基类的成员函数可以引用,只有基类的成员函数可以引用它。基类的成员在公用派生类中的引用权限见表它。基类的成员在公用派生类中的引用权限见表15.1。表表15.1 公用派生类的继承关系公用派生类的继承关系基类私有成员公用成员公用派生类不可访问的成员公用成员域含区玛套饥晋猾少拂赫夜挡曾健韶单低馏烫郎契一稗掉敦堵崩阿啄把裸第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第

66、15章C的面向对象基础ppt例例15.5 访问基类成员。访问基类成员。class stud /声明基类声明基类private : /基类私有成员基类私有成员 int num; char name10; char sex; public: /基类公用成员基类公用成员 void display( ) coutnum: numendl; coutname: nameendl; coutsex: sexendl; ; class student: public stud /声明一个公用派生类声明一个公用派生类 皱咏徐髓愉念做框陡鲜绚灵半氯泳刘醉债夸芽钙松掖溅痊归獭吟猾护焦邑第15章C的面向对象基础pp

67、t第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础pptprivate: int age; char addr30; public: void show( ) coutnum: numendl; /企图引用基类的私有成员,企图引用基类的私有成员,错误。错误。 coutname: nameendl; /企图引用基类的私有企图引用基类的私有成员,错误。成员,错误。 coutsex: sexendl; /企图引用基类的私有成企图引用基类的私有成员,错误。员,错误。 coutage: ageendl;

68、/引用派生类的私有成员,引用派生类的私有成员,正确。正确。 coutaddress: addrendl; /引用派生类的私有成引用派生类的私有成员,正确。员,正确。; 悔耶案盟劳故健造虑嘘赤饵祝液领佐奴斗境泵砷靖稳腔肺区篓内馏饵砍壁第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt由于基类的私有成员对派生类来说是不可访问的,因此由于基类的私有成员对派生类来说是不可访问的,因此在派生类中的在派生类中的show函数中直接引用基类的私有数据成函数中直接引用基类的私有数

69、据成员员num,name和和sex是不允许的。可以通过基类的公是不允许的。可以通过基类的公用成员函数来引用基类的私有数据成员。上面对派生用成员函数来引用基类的私有数据成员。上面对派生类类student的声明可改为的声明可改为class student: public stud /声明一个公用派生类声明一个公用派生类 private: int age; char addr20; public: void show( ) display( ); /引用基类的公用成员函数,允许。引用基类的公用成员函数,允许。 coutage: ageendl; /引用派生类的私有成员,引用派生类的私有成员,正确。正

70、确。 coutaddress: addrendl; /引用派生类的私有成员,引用派生类的私有成员,正确。正确。;媒远亦凉旧稻鉴钢轮躇甫绿扔型抱质玩翁牧裂笨疲粘恍素蓬穿可咽删狱讣第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt在派生类成员函数在派生类成员函数show中引用基类的公用成员函数中引用基类的公用成员函数display,通过,通过display引用基类引用基类stud中的私有数据中的私有数据 num、name 和和sex。可以这样写。可以这样写main函

71、数(假设对函数(假设对象象a中已有数据):中已有数据):void main( )student a;/定义一个定义一个student派生类的对象派生类的对象a a.show( ); /输出输出a对象的对象的5个数据个数据;请分析在主函数中能否出现以下语句:请分析在主函数中能否出现以下语句:a.display( ); /正正确。从基类继承的公用成员函数确。从基类继承的公用成员函数a.age=18; /错误。外界不能引用派生类的私有错误。外界不能引用派生类的私有成员成员a.num=10020; /错误。外界不能引用基类的私错误。外界不能引用基类的私有成员有成员骡谱舵搏嫡吁盟那辜纤女歼娇骚太骚春品摄

72、靳湃苏废漳缘沧烽屠旷桂除浚第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.4.4 私有派生类私有派生类在声明一个派生类时,将基类的引用权限指定为在声明一个派生类时,将基类的引用权限指定为private的,该类称为基类的私有派生类。的,该类称为基类的私有派生类。在私有派生类中,基类的公用成员和保护成员成为在私有派生类中,基类的公用成员和保护成员成为派生类中的私有成员,基类的私有成员成为派生类派生类中的私有成员,基类的私有成员成为派生类“不可访问的成员不可访

73、问的成员”,只有基类的成员函数可以引,只有基类的成员函数可以引用它。基类的成员在私有派生类中的引用权限见表用它。基类的成员在私有派生类中的引用权限见表15.2。表表15.2 私有派生类的继承关系私有派生类的继承关系基类私有成员公用成员私有派生类不可访问的成员私有成员燥洗踊嫌逐袁妈吗竟敌拨永哦义孪颜边陕替幂烈衫役盂僚吗洋竹账诉昆蔡第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt如果派生类声明首行改为如果派生类声明首行改为class student: privat

74、e stud/声明一个私有派生类声明一个私有派生类 private: int age; char addr30; public: void show( ) display( ); /基类的公用成员函数变成派生类的私有函基类的公用成员函数变成派生类的私有函数数coutage: ageendl; /引用派生类的私有成员,正确。引用派生类的私有成员,正确。 coutaddress: addrendl; /引用派生类的私有成引用派生类的私有成员,正确。员,正确。; void main( )student a;/定义一个派生类的对象定义一个派生类的对象a a.display( ); /错误。基类的公用成

75、员函数变成派生类私有函数错误。基类的公用成员函数变成派生类私有函数 a.age=18; /错误。外界不能引用派生类的私有成员错误。外界不能引用派生类的私有成员 奥畴传弟涡骋琳闽椒绩啊童穗栏差古掳较农木癸晨惺琅族急妄窿声尘条蛆第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt可以看到:可以看到:(1) 不能通过私有派生类对象不能通过私有派生类对象(如如a)引用从基类继承)引用从基类继承过来的任何成员。过来的任何成员。(2) 在派生类的成员函数中不能访问基类的私有成

76、员,在派生类的成员函数中不能访问基类的私有成员,但可以访问基类的公用成员。但可以访问基类的公用成员。由于私有派生类限制太多,一般不常使用。由于私有派生类限制太多,一般不常使用。烩彻过抗威巡掌礁劲杭磨商屠易撞攘涵鲍警二喀妈陡捕丘这燃炼糙捧挫河第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.4.5 保护成员保护成员前面已接触过前面已接触过“保护保护”(protected)这一名词。它)这一名词。它和和private、public一样是用来声明成员的引用权限一

77、样是用来声明成员的引用权限的。由的。由protected声明的成员称为保护成员。保护成声明的成员称为保护成员。保护成员不能被外界引用(这点和私有成员类似),但它员不能被外界引用(这点和私有成员类似),但它可以被派生类的成员函数引用。可以被派生类的成员函数引用。将表将表15.1和表和表15.2综合表示并增加保护成员的内容,综合表示并增加保护成员的内容,见表见表15.3。表表15.3 派生类的继承关系派生类的继承关系基类私有成员公用成员保护成员公用派生类不可访问的成员公用成员保护成员私有派生类不可访问的成员私有成员私有成员课噪椒拥鸦铀求纪很桩滚忘填茬珊迂削具胶勇宙蚜奎杀鸡晌蝎煌矽骋樊亲第15章C的

78、面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt从前面的介绍已知基类的私有成员被派生类(不论是私从前面的介绍已知基类的私有成员被派生类(不论是私有派生类还是公用派生类)继承后变为有派生类还是公用派生类)继承后变为“不可访问的不可访问的成员成员”。 如果想在派生类引用基类的成员,可以将基如果想在派生类引用基类的成员,可以将基类的成员声明为类的成员声明为protected。例例15.6 派生类引用保护成员。派生类引用保护成员。class stud/声明基类声明基类protec

79、ted : /基类保护成员基类保护成员 int num; char name10; char sex; public: /基类公用成员基类公用成员 void display( ) coutnum: numendl; coutname: nameendl; coutsex: sexendl; ; class student: public stud /声明一个公用派生类声明一个公用派生类烤枢妮谍诬费材清肤林善厢甚耘仿讽倒炸贱兽暂捅蚤滥韭郊刷铡劈壁顽掀第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础

80、ppt第15章C的面向对象基础ppt private: int age; char addr30; public: void show( ) coutnum: numendl;/引用基类的保护成员,合法。引用基类的保护成员,合法。 coutsex: sexendl; /引用基类的保护成员,合法。引用基类的保护成员,合法。 coutage: ageendl; /引用派生类的私有成员,合法。引用派生类的私有成员,合法。coutaddress: addrendl;/引用派生类的私有成员,合法。引用派生类的私有成员,合法。 ; void main( ) student a; /a是派生类是派生类stu

81、dent类的对象。类的对象。 a.show( ); /合法。合法。show是派生类中的公用成员函是派生类中的公用成员函数。数。 a.num=10023; /错误。外界不能访问保护成员。错误。外界不能访问保护成员。 屡眷列婪鸽漱授务挠憋棒喘靳屏驭瞻铱桃镭振摘馋菌谨凡闯铁恐憾梦支桨第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt请与例请与例15.5对比分析。可以看到基类的保护成员对类对比分析。可以看到基类的保护成员对类的外界来说仍然是不可引用的(由于的外界来说仍然

82、是不可引用的(由于stud中的中的num是保护成员,外界不能用是保护成员,外界不能用a.num来引用它),但对来引用它),但对派生类来说它相当于私有成员,可以通过成员函数派生类来说它相当于私有成员,可以通过成员函数引用。也就是把保护成员的引用范围扩展到派生类引用。也就是把保护成员的引用范围扩展到派生类中。中。蚁盗痈脉潜增写夏溶典斟刘寨贡刺则霄瘪玄冰痛扔参艇联揖再腑卜垮昂檄第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15.4.6 派生类的构造函数派生类的构造

83、函数派生类从基类继承了非私有成员函数和数据成员,派生类从基类继承了非私有成员函数和数据成员,但是在建立派生类的对象时,系统只执行派生类的但是在建立派生类的对象时,系统只执行派生类的构造函数,而不会自动执行基类的构造函数。也就构造函数,而不会自动执行基类的构造函数。也就是说,基类的构造函数是不能继承的。如果基类的是说,基类的构造函数是不能继承的。如果基类的构造函数包含对变量的初始化,那么在建立派生类构造函数包含对变量的初始化,那么在建立派生类的对象时,由于没有执行基类的构造函数,因而就的对象时,由于没有执行基类的构造函数,因而就会使基类的变量未初始化。所以在设计派生类的构会使基类的变量未初始化。

84、所以在设计派生类的构造函数时,不仅要考虑派生类所增加的变量初始化,造函数时,不仅要考虑派生类所增加的变量初始化,还应当考虑基类的变量初始化。在执行派生类的构还应当考虑基类的变量初始化。在执行派生类的构造函数时,应当调用基类的构造函数。造函数时,应当调用基类的构造函数。护钓而欺瘸足钓烟啦廷亲毡索兄墙仗劳骸撅砸鸥啼韧爱盔碱砰赔代垢怠苯第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt例例15.7 派生类的构造函数。派生类的构造函数。#include#include

85、class stud/声明基类声明基类 protected: /保护部分保护部分 int num; char name10; char sex ; public: /公用部分公用部分 stud(int n, char nam, char s ) /基类构造函数基类构造函数 num=n; strcpy(name, nam); sex=s; stud( ) /基类析构函数基类析构函数;阂睫娠粗淮美业拼赞掇撰蛰照云绒垦溉漏盗谜戌趴捍阳竣酵涯籍青泰浙舟第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础pp

86、t第15章C的面向对象基础pptclass student: public stud /声明公用派生类声明公用派生类student private: /派生类的私有数据派生类的私有数据 int age; char addr30; public: student(int n, char nam,char s , int a, char ad) : stud(n, nam, s) /派生类构造函数派生类构造函数 age=a; /在此处只对派生类新增的变量初始化在此处只对派生类新增的变量初始化 strcpy(addr, ad); void show( ) coutnum: numendl; cout

87、name: nameendl; coutsex: sexendl; coutage: ageendl; coutaddress: addrendl; student ( ) /派生类析构函数派生类析构函数 ;悬词翁仓囤讯瀑夸廷柏槛损纯锰汕色削募撑调珠级农掐件决四剪换缴仲真第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础pptvoid main( )student a(10010,Wang-li, f, 19, 115 Beijing Road, Shanghai);

88、 student b(10011,Zhang-fun, m , 21, 213 Shanghai Road, Beijing); a.show( ); /输出第一个学生的数据输出第一个学生的数据 b.show( ); /输出第二个学生的数据输出第二个学生的数据请注意派生类构造函数首行的写法:请注意派生类构造函数首行的写法:student (int n, char nam, char s , int a, char ad) : stud(n, nam, s)其一般形式为其一般形式为派生类构造函数名(参数表列):基类构造函数名派生类构造函数名(参数表列):基类构造函数名(参数表列)(参数表列)皱赁

89、敞衫萤烧人饥涡盾蹭狼溶阻扁致炎喉肾缘劲摆顽火掷颂两烁迹彼愁徊第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt派生类构造函数名后面括号内的参数表列包括参数派生类构造函数名后面括号内的参数表列包括参数的类型和参数名。基类构造函数名后面括号内的参的类型和参数名。基类构造函数名后面括号内的参数表列只有参数名而不包括参数类型。从基类的声数表列只有参数名而不包括参数类型。从基类的声明中可以看到基类构造函数明中可以看到基类构造函数stud有有3个参数(个参数(n, nam,

90、 s),派生类构造函数),派生类构造函数student有有5个参数,个参数,前前3个是用来传递给基类构造函数的,后面个是用来传递给基类构造函数的,后面2个(个(a和和ad)是用来对派生类所增加的变量初始化的。)是用来对派生类所增加的变量初始化的。在在main函数中建立对象函数中建立对象a时指定了时指定了5个实参。它们按个实参。它们按顺序传递给派生类构造函数的形参。然后,派生类顺序传递给派生类构造函数的形参。然后,派生类构造函数将前面构造函数将前面3个传递给基类构造函数的参数。个传递给基类构造函数的参数。见图见图15.6。祷停废攫蛆氦天蓑蒋唁跋砸印泌姨涤惋滤案释诛酉鞭叛静带自遁敬挡扮撰第15章C

91、的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt图图 15.6通过通过stud (n, nam, s) 把把3个值再传给基类构造函数个值再传给基类构造函数,见图,见图15.7。墟简蕉雪妹伪热梅慢横敬暖曙愁赐麓诣私洁番健鳞瑶柄条停眉呜矾赶耽郑第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt stud (n , nam , s) stud(

92、int n, char nam, char s )/这是基类构造函数的首部这是基类构造函数的首部图图 15.7在上例中也可以将派生类构造函数在类外面定义,而在在上例中也可以将派生类构造函数在类外面定义,而在类的声明中只写该函数的声明:类的声明中只写该函数的声明:student(int n, char nam,char s , int a, char ad); 在类的外面定义派生类构造函数:在类的外面定义派生类构造函数:student student (int n, char nam,char s , int a, char ad ): stud(n, nam, s) age=a; strcpy

93、(addr, ad);杂捡瘫雨檄铰削竭协扯褪讨转闯箩拙逼袒吮乖苞孤智泻杏刷早惶宴亿测极第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt注意:在类中对派生类构造函数作声明时,不包括注意:在类中对派生类构造函数作声明时,不包括基类构造函数名和参数表列(即基类构造函数名和参数表列(即stud(n, nam, s))。只在定义函数时才将它列出。)。只在定义函数时才将它列出。在建立一个对象时,由派生类构造函数先调用基类在建立一个对象时,由派生类构造函数先调用基类构造函数

94、,然后再执行派生类构造函数本身。对上构造函数,然后再执行派生类构造函数本身。对上例来说,先初始化例来说,先初始化num, name, sex,然后再初,然后再初始化始化age和和addr。在派生类对象消失时,先执行派生类析构函数在派生类对象消失时,先执行派生类析构函数student( ),再执行其基类析构函数,再执行其基类析构函数stud( )。丁寄伐踪栽鸽嘎蓉伙盔做兰锤馒价镁涩跟成酬脓疵判和岛级寄闯牵葫千蓟第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt15

95、.4.7 继承在软件开发中的重要意义继承在软件开发中的重要意义继承是面向对象技术的一个重要内容。有了继承,继承是面向对象技术的一个重要内容。有了继承,使软件的重用成为可能。过去,软件人员开发新的使软件的重用成为可能。过去,软件人员开发新的软件,能从已有的软件中直接选用完全符合要求的软件,能从已有的软件中直接选用完全符合要求的部件不多,一般都要进行许多修改才能使用,实际部件不多,一般都要进行许多修改才能使用,实际上有相当部分要重新编写,工作量很大。继承机制上有相当部分要重新编写,工作量很大。继承机制解决了这个问题。将已有的一个类为基础,生成一解决了这个问题。将已有的一个类为基础,生成一些派生类(

96、子类),在子类中保存父类中有用的数些派生类(子类),在子类中保存父类中有用的数据和操作,去掉(屏蔽掉)不需要的部分。新生成据和操作,去掉(屏蔽掉)不需要的部分。新生成的子类还可以再生成孙类的子类还可以再生成孙类而且一个子类可以从而且一个子类可以从多个父类中获得继承(即多继承机制)。编写面向多个父类中获得继承(即多继承机制)。编写面向对象的程序时要把注意力放在实现有用的类上面,对象的程序时要把注意力放在实现有用的类上面,对已有的类加以整理和分类就有可能使这些类能够对已有的类加以整理和分类就有可能使这些类能够被程序设计的许多领域使用。被程序设计的许多领域使用。馋旦哆抿钨盔靴乌坐悉脊坠阿涧董肺惋稼景

97、纪纤落妆秸恨遮换朱泽钞忌僳第15章C的面向对象基础ppt第15章C的面向对象基础ppt勒端仕脯谁渝粪棒桥痛咒男兔捆娜五立镊撕士战南控端国捕闻纵边碳悲群第15章C的面向对象基础ppt第15章C的面向对象基础ppt软件设计者可以最大限度地重用已有软件,对已有软件设计者可以最大限度地重用已有软件,对已有的类根据需要进行剪裁和修改,在此基础上集中精的类根据需要进行剪裁和修改,在此基础上集中精力编写子类新增加的部分即可。因此有人认为继承力编写子类新增加的部分即可。因此有人认为继承是是C+和和C的最重要的区别之一。的最重要的区别之一。在本章中我们只是很简单地介绍了在本章中我们只是很简单地介绍了C+面向对象

98、的面向对象的一些初步知识。面向对象技术和一些初步知识。面向对象技术和C+的内容很丰富,的内容很丰富,有许多深入的概念,语法规定也比较复杂,需要花有许多深入的概念,语法规定也比较复杂,需要花较多的精力和时间去学习和消化。较多的精力和时间去学习和消化。C+最重要的概最重要的概念是类,其他许多概念都是与类有关的。为了便于念是类,其他许多概念都是与类有关的。为了便于理解,我们在本章中没有介绍复杂的程序,所举的理解,我们在本章中没有介绍复杂的程序,所举的例题都是比较简单的,只是为了说明一些概念。正例题都是比较简单的,只是为了说明一些概念。正如在本章开始时提到的,只有编写过大程序的人才如在本章开始时提到的,只有编写过大程序的人才能真正体会能真正体会C+的优越性。我们只是希望通过本章的优越性。我们只是希望通过本章的介绍,使读者对的介绍,使读者对C+的特点有初步的了解,为以的特点有初步的了解,为以后系统地学习后系统地学习C+建立一些基础。建立一些基础。 栗发彤猴示厚虾豁孰行纷柑蚁宋潮读勿缉翱鞋阔整艾拜呛卵刹溜虽陡灵臀第15章C的面向对象基础ppt第15章C的面向对象基础ppt

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

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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