欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    面向对象程序设计中的概念课件.ppt

    • 资源ID:91037823       资源大小:515.50KB        全文页数:125页
    • 资源格式: PPT        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    面向对象程序设计中的概念课件.ppt

    1.对象对象客观世界中任何一个事物都可以看成一个对象客观世界中任何一个事物都可以看成一个对象(object)。对象可大可小。对象是构成系统的基本单位。对象可大可小。对象是构成系统的基本单位。一个对象往往是由一组属性和一组行为构成的。一个对象往往是由一组属性和一组行为构成的。2.封装与信息隐蔽封装与信息隐蔽面向对象程序设计方法的一个重要特点就是面向对象程序设计方法的一个重要特点就是“封装性封装性”(encapsulation),所谓,所谓“封装封装”,指两方面的含义:,指两方面的含义:一、将有关的数据和操作代码封装在一个对象中,形成一个基一、将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。本单位,各个对象之间相对独立,互不干扰。二、将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下二、将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。少量接口,以便与外界联系,接收外界的消息。信息隐蔽还有利于数据安全,防止无关的人了解和修改数据。信息隐蔽还有利于数据安全,防止无关的人了解和修改数据。面向对象程序设计中的概念面向对象程序设计中的概念13.抽象抽象在程序设计方法中,常用到抽象在程序设计方法中,常用到抽象(abstraction)这一名)这一名词。抽象的过程是将有关事物的共性归纳、集中的过程。词。抽象的过程是将有关事物的共性归纳、集中的过程。抽象的作用是表示同一类事物的本质。抽象的作用是表示同一类事物的本质。C+中的类就是中的类就是对一批具体的数的抽象。对一批具体的数的抽象。类是对象的抽象,而对象则是类的特例,或者说是类的类是对象的抽象,而对象则是类的特例,或者说是类的具体表现形式。具体表现形式。4.继承与重用继承与重用如果在软件开发中已经建立了一个名为如果在软件开发中已经建立了一个名为A的的“类类”,又,又想另外建立一个名为想另外建立一个名为B的的“类类”,而后者与前者内容基本相,而后者与前者内容基本相同,只是在前者的基础上增加一些属性和行为,只需在类同,只是在前者的基础上增加一些属性和行为,只需在类A的基础上增加一些新内容即可。这就是面向对象程序设计中的基础上增加一些新内容即可。这就是面向对象程序设计中的继承机制。利用继承可以简化程序设计的步骤。的继承机制。利用继承可以简化程序设计的步骤。C+提供了继承机制,采用继承的方法可以很方便地利提供了继承机制,采用继承的方法可以很方便地利用一个已有的类建立一个新的类。这就是常说的用一个已有的类建立一个新的类。这就是常说的“软件重用软件重用”的思想。的思想。25.多态性多态性如果有几个相似而不完全相同的对象,有时人们要求如果有几个相似而不完全相同的对象,有时人们要求在向它们发出同一个消息时,它们的反应各不相同,分别在向它们发出同一个消息时,它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。执行不同的操作。这种情况就是多态现象。如,在如,在Windows环境下,用鼠标双击一个文件对象环境下,用鼠标双击一个文件对象(这这就是向对象传送一个消息就是向对象传送一个消息),如果对象是一个可执行文件,如果对象是一个可执行文件,则会执行此程序,如果对象是一个文本文件,则启动文本则会执行此程序,如果对象是一个文本文件,则启动文本编辑器并打开该文件。编辑器并打开该文件。在在C+中,所谓多态性中,所谓多态性(polymorphism)是指:是指:由继承由继承而产生的相关的不同的类,其对象对同一消息会作出不同而产生的相关的不同的类,其对象对同一消息会作出不同的响应。的响应。多态性是面向对象程序设计的一个重要特征,能增加多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。程序的灵活性。3传统的面向过程程序设计是围绕功能进行的,用一个函数传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。所有的数据都是公用的,一个函数可以使实现一个功能。所有的数据都是公用的,一个函数可以使用任何一组数据,而一组数据又能被多个函数所使用(见用任何一组数据,而一组数据又能被多个函数所使用(见图图8.3)。)。面向对象程序设计的特点面向对象程序设计的特点4l 面向对象程序设计采取的是另外一种思路。面向对象程序设计采取的是另外一种思路。l 程序设计者的任务包括两个方面:程序设计者的任务包括两个方面:一是设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;二是考虑怎样向有关对象发送消息,以完成所需的任务。这时它如同一个总调度,不断地向各个对象发出命令,让这些对象活动起来(或者说激活这些对象),完成自己职责范围内的工作。各个对象的操作完成了,整体任务也就完成了。l 显然,对一个大型任务来说,面向对象程序设显然,对一个大型任务来说,面向对象程序设计方法是十分有效的,它利用代码的重用,大大计方法是十分有效的,它利用代码的重用,大大降低程序设计人员的工作难度,减少出错机会。降低程序设计人员的工作难度,减少出错机会。5l 类是类是C+中十分重要的概念,它是实现面向对象程序设计的基础。中十分重要的概念,它是实现面向对象程序设计的基础。l 类是所有面向对象的语言的共同特征,所有面向对象的语言都提类是所有面向对象的语言的共同特征,所有面向对象的语言都提供了这种类型。一个有一定规模的供了这种类型。一个有一定规模的C+程序是由许多类所构成的。程序是由许多类所构成的。l 面向对象的软件工程是面向对象方法在软件工程领域的全面应用。面向对象的软件工程是面向对象方法在软件工程领域的全面应用。它包括它包括:面向对象的分析(OOA)面向对象的设计(OOD)面向对象的编程(OOP)Object-Oriented Programming面向对象的测试(OOT)面向对象的软件维护(OOSM)类和对象的作用类和对象的作用6l 类是用户自己定义的类型。如果程序中要用到类类型,必类是用户自己定义的类型。如果程序中要用到类类型,必须自己根据需要进行声明,或者使用别人已设计好的类。须自己根据需要进行声明,或者使用别人已设计好的类。l 类类(class)就是对象的类型。类是一种广义的数据类型。就是对象的类型。类是一种广义的数据类型。类这种数据类型中的数据既包含数据,也包含操作数据的类这种数据类型中的数据既包含数据,也包含操作数据的函数。函数。l 不能把类中的全部成员与外界隔离,一般是把数据隐蔽不能把类中的全部成员与外界隔离,一般是把数据隐蔽起来,而把成员函数作为对外界的接口。起来,而把成员函数作为对外界的接口。class Student /声明类类型声明类类型 private:/声明以下部分为私有的声明以下部分为私有的int num;char name20;char sex;public:/声明以下部分为公用的声明以下部分为公用的void display()coutnum:numendl;coutname:nameendl;coutsex:sexendl;Student stud1,stud2;/定义了两个定义了两个Student 类的对象类的对象声明类类型声明类类型7l 类的成员函数类的成员函数(简称类函数简称类函数)是函数的一种,它的用法和作用是函数的一种,它的用法和作用和函数基本上是一样的,它也有返回值和函数类型。和函数基本上是一样的,它也有返回值和函数类型。l 它与一般函数的区别只是:它与一般函数的区别只是:它是属于一个类的成员,出现在它是属于一个类的成员,出现在类体中。类体中。l一般的做法是将需要被外界调用的成员函数指定为一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。它们是类的对外接口。l 注意,并非要求把所有成员函数都指定为注意,并非要求把所有成员函数都指定为public。有的函数。有的函数并不是准备为外界调用的,而是为本类中的成员函数所调用的,并不是准备为外界调用的,而是为本类中的成员函数所调用的,就应该将它们指定为就应该将它们指定为private。这种函数的作用是支持其他函数。这种函数的作用是支持其他函数的操作,是类中其他成员的工具函数的操作,是类中其他成员的工具函数(utility function),类,类外用户不能调用这些私有的工具函数。外用户不能调用这些私有的工具函数。l 类的成员函数是类体中十分重要的部分。如果一个类中不包类的成员函数是类体中十分重要的部分。如果一个类中不包含成员函数,就等同于含成员函数,就等同于C语言中的结构体了,体现不出类在面语言中的结构体了,体现不出类在面向对象程序设计中的作用。向对象程序设计中的作用。类的成员函数类的成员函数成员函数的性质成员函数的性质8在前面的成员函数是在类体中定义的。也可以在类体中只写在前面的成员函数是在类体中定义的。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如成员函数的声明,而在类的外面进行函数定义。如:class Student public:void display();/公用成员函数原型声明公用成员函数原型声明 private:int num;string name;char sex;/以上以上3行是私有数据成员行是私有数据成员 ;void Student display()/在类外定义在类外定义display类函数类函数 coutnum:numendl;/函数体函数体 coutname:nameendl;coutsex:sexhourminutesec;int main()Time t1,t2;coutsizeof(Time)endl;coutsizeof(t1)endl;coutsizeof(t1)endl;return 0;12l C+通过类来实现封装性,把数据和与这些数据有关的操作封通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中。装在一个类中。l 公用成员函数是用户使用类的公用接口公用成员函数是用户使用类的公用接口,或称类的对外接口。或称类的对外接口。类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现种实现称为私有实现(private implementation)。这种这种“类的类的公用接口与私有实现的分离公用接口与私有实现的分离”形成了信息隐蔽。形成了信息隐蔽。软件工程的一个最基本的原则就是将接口与实现分离,它的好软件工程的一个最基本的原则就是将接口与实现分离,它的好处在于:处在于:(1)如果想修改或扩充类的功能,只需修改本类中有关的数据成如果想修改或扩充类的功能,只需修改本类中有关的数据成员和与它有关的成员函数,程序中类外的部分可以不必修改。员和与它有关的成员函数,程序中类外的部分可以不必修改。(2)如果在编译时发现类中的数据读写有错,不必检查整个程序,如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的少数成员函数。只需检查本类中访问这些数据的少数成员函数。类的封装性和信息隐蔽类的封装性和信息隐蔽 公用接口与私有实现的分离公用接口与私有实现的分离13l 在面向对象的程序开发中,在面向对象的程序开发中,一般做法是将类的声明放在一般做法是将类的声明放在指定的头文件中指定的头文件中,用户如果想用该类,只要把有关的头文,用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,提高件包含进来即可,不必在程序中重复书写类的声明,提高编程的效率。编程的效率。l 由于在头文件中包含了类的声明,因此在程序中就可以由于在头文件中包含了类的声明,因此在程序中就可以用该类来定义对象。由于在类体中包含了对成员函数的声用该类来定义对象。由于在类体中包含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数。为了明,在程序中就可以调用这些对象的公用成员函数。为了实现信息隐蔽,对类成员函数的定义一般不放在头文件中,实现信息隐蔽,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中。而另外放在一个文件中。类声明和成员函数定义的分离类声明和成员函数定义的分离14/student.h (头文件可以包括头文件可以包括:外部变量声明、函数原型声明、类声明、常外部变量声明、函数原型声明、类声明、常量声明、内联函数和量声明、内联函数和typedef声明,该头文件则进行类的声明声明,该头文件则进行类的声明)class Student /类声明类声明 public:void display();/公用成员函数原型声明公用成员函数原型声明private:int num;char name20;char sex;/student.cpp /在此文件中进行函数的定义在此文件中进行函数的定义#include#include“student.h”/不要漏写此行,否则编译通不过不要漏写此行,否则编译通不过Using namespace std;void Student display()/在类外定义在类外定义display类函数类函数coutnum:numendl;coutname:nameendl;coutsex:sexendl;类声明和成员函数定义的分离类声明和成员函数定义的分离15为了组成一个完整的源程序,还应当有包括主函数的源文为了组成一个完整的源程序,还应当有包括主函数的源文件:件:/main.cpp 主函数模块主函数模块/#include#include“student.h”/将类声明头文件包含进来将类声明头文件包含进来/using namespace std;int main()Student stud;/定义对象定义对象 stud.display();/执行执行stud对象的对象的display函数函数 return 0;这是一个包括这是一个包括3个文件的程序,组成两个文件模块:个文件的程序,组成两个文件模块:一个是一个是主模块主模块main.cpp,一个是,一个是student.cpp。在主模块中又包。在主模块中又包含头文件含头文件student.h。在预编译时会将头文件。在预编译时会将头文件student.h中中的内容取代的内容取代#include student.h行。行。16请注意:请注意:由于将头文件由于将头文件student.h放在用户当前目录中,因放在用户当前目录中,因此在文件名两侧用双撇号包起来此在文件名两侧用双撇号包起来(student.h)而不用尖而不用尖括号括号(),否则编译时会找不到此文件。,否则编译时会找不到此文件。17l 由于要求接口与实现分离,为软件开发商向用户提供类由于要求接口与实现分离,为软件开发商向用户提供类库创造了很好的条件。库创造了很好的条件。l 开发商把用户所需的各种类的声明按类放在不同的头文开发商把用户所需的各种类的声明按类放在不同的头文件中,同时对包含成员函数定义的源文件进行编译,得到件中,同时对包含成员函数定义的源文件进行编译,得到成员函数定义的目标代码。软件商向用户提供这些头文件成员函数定义的目标代码。软件商向用户提供这些头文件和类的实现的目标代码和类的实现的目标代码(不提供函数定义的源代码不提供函数定义的源代码)。l 用户在使用类库中的类时,只需将有关头文件包含到自用户在使用类库中的类时,只需将有关头文件包含到自己的程序中,并且在编译后连接成员函数定义的目标代码己的程序中,并且在编译后连接成员函数定义的目标代码即可。即可。l 由于类库的出现,用户可以像使用零件一样方便地使用由于类库的出现,用户可以像使用零件一样方便地使用在实践中积累的通用的或专用的类,这就大大减少了程序在实践中积累的通用的或专用的类,这就大大减少了程序设计的工作量,有效地提高了工作效率。设计的工作量,有效地提高了工作效率。18l 在面向对象程序理论中,在面向对象程序理论中,“方法方法”是指对数据的操作。是指对数据的操作。一个一个“方法方法”对应一种操作。显然,只有被声明为公用的对应一种操作。显然,只有被声明为公用的方法(成员函数)才能被对象外界所激活。方法(成员函数)才能被对象外界所激活。l 外界是通过发外界是通过发“消息消息”来激活有关方法的。所谓来激活有关方法的。所谓“消息消息”,其实就是一个命令,由程序语句来实现。,其实就是一个命令,由程序语句来实现。stud.display();就是向对象就是向对象stud发出的一个发出的一个“消息消息”,通知它执行其中,通知它执行其中的的display“方法方法”(即(即display函数)。函数)。l 上面这个语句涉及上面这个语句涉及3个术语:个术语:对象、方法和消息。对象、方法和消息。stud是对象,是对象,display()是方法,语句是方法,语句“stud.display();”是是消息。消息。面向对象程序设计中的几个名词面向对象程序设计中的几个名词19例例8.3 将程序用含成员函数的类来处理。将程序用含成员函数的类来处理。#include using namespace std;class Timepublic:void set_time();/公用成员函数公用成员函数void show_time();/公用成员函数公用成员函数 private:/数据成员为私有数据成员为私有int hour;int minute;int sec;int main()Time t1;/定义对象定义对象t1 t1.set_time();/调用对象调用对象t1的成员函数的成员函数set_time,向,向t1的数据成员输入数据的数据成员输入数据 t1.show_time();/调用对象调用对象t1的成员函数的成员函数show_time,输出,输出t1的数据成员的值的数据成员的值 Time t2;/定义对象定义对象t2类和对象的简单应用举例类和对象的简单应用举例20 t2.set_time();/调用对象调用对象t2的成员函数的成员函数set_time,向,向t2的数据成员输入数据的数据成员输入数据 t2.show_time();/调用对象调用对象t2的成员函数的成员函数show_time,输出,输出t2的数据成员的值的数据成员的值 return 0;void Time set_time()/在类外定义在类外定义set_time函数函数 cinhour;cinminute;cinsec;void Time show_time()/在类外定义在类外定义show_time函数函数 couthour:minute:secendl;21例例8.4 找出一个整型数组中的元素的最大值。找出一个整型数组中的元素的最大值。这个问题可以不用类的方法来解决,现在用类来处理,读这个问题可以不用类的方法来解决,现在用类来处理,读者可以比较不同方法的特点。者可以比较不同方法的特点。#include using namespace std;class 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;22void Array_max:max_value()/成员函数定义,找数组元素中的最大值成员函数定义,找数组元素中的最大值 int i;max=array0;for(i=1;imax)max=arrayi;void Array_max:show_value()/成员函数定义,输出最大值成员函数定义,输出最大值 cout“max=”maxendl;int main()Array_max arrmax;/定义对象定义对象arrmax arrmax.set_value();/调用调用arrmax的的set_value函数,向数组元素输入数函数,向数组元素输入数值值 arrmax.max_value();/调用调用arrmax的的max_value函数,找出数组元素中的函数,找出数组元素中的最大值最大值 arrmax.show_value();/调用调用arrmax的的show_value函数,输出数组元素中函数,输出数组元素中的最大值的最大值 return 0;/运行结果如下:运行结果如下:12 12 39-34 17 134 045-91 76 (输入输入10个元素的值个元素的值)max=134 (输入输入10个元素中的最大值个元素中的最大值)23l C+提供了构造函数提供了构造函数(constructor)来处理对象的初始化。来处理对象的初始化。l 构造函数是一种特殊的成员函数,与其他成员函数不同,构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。不需要用户来调用它,而是在建立对象时自动执行。l 构造函数的名字必须与类名同名,而不能由用户任意命构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。名,以便编译系统能识别它并把它作为构造函数处理。l它不具有任何类型,不返回任何值。构造函数的功能是由它不具有任何类型,不返回任何值。构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参用户定义的,用户根据初始化的要求设计函数体和函数参数。数。构造函数的作用构造函数的作用24例例9.1 在例在例8.3基础上定义构造成员函数。基础上定义构造成员函数。#include using namespace std;class Timepublic:Time()/定义构造成员函数,函数名与类名相同定义构造成员函数,函数名与类名相同 hour=0;/利用构造函数对对象中的数据成员赋初值利用构造函数对对象中的数据成员赋初值 minute=0;sec=0;void set_time();/函数声明函数声明void show_time();/函数声明函数声明private:int hour;/私有数据成员私有数据成员int minute;int sec;25void Time set_time()/定义成员函数,向数据成员赋值定义成员函数,向数据成员赋值cinhour;cinminute;cinsec;void Time show_time()/定义成员函数,输出数据成员的值定义成员函数,输出数据成员的值 couthour:minute:secendl;int main()Time t1;/建立对象建立对象t1,同时调用构造函数,同时调用构造函数t1.Time()t1.set_time();/对对t1的数据成员赋值的数据成员赋值 t1.show_time();/显示显示t1的数据成员的值的数据成员的值 Time t2;/建立对象建立对象t2,同时调用构造函数,同时调用构造函数t2.Time()t2.show_time();/显示显示t2的数据成员的值的数据成员的值 return 0;/程序运行的情况为:程序运行的情况为:10 25 54 (从键盘输入新值赋给从键盘输入新值赋给t1的数据成员的数据成员)10:25:54 (输出输出t1的时、分、秒值的时、分、秒值)0:0:0 (输出输出t2的时、分、秒值的时、分、秒值)26有关构造函数的使用,有以下说明:有关构造函数的使用,有以下说明:(1)在类对象进入其作用域时调用构造函数,因此主函数中在类对象进入其作用域时调用构造函数,因此主函数中不需要指定调用构造函数不需要指定调用构造函数,这是它和一般函数的一个重要,这是它和一般函数的一个重要的不同之点;的不同之点;(2)构造函数不需用户调用,也不能被用户调用;构造函数不需用户调用,也不能被用户调用;(3)构造函数没有返回值;构造函数没有返回值;(4)如果用户自己没有定义构造函数,则如果用户自己没有定义构造函数,则C+系统会自动生系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。没有参数,不执行初始化操作。27例例9.2 有两个长方柱,其长、宽、高分别为:有两个长方柱,其长、宽、高分别为:(1)12,20,25;(2)15,30,21。求它们的体积。求它们的体积。#include using namespace std;class Boxpublic:Box(int,int,int);/声明带参数的构造函数声明带参数的构造函数 int volume();/声明计算体积的函数声明计算体积的函数 private:int height;int width;int length;Box Box(int h,int w,int len)/在类外定义带参数的构造函数在类外定义带参数的构造函数 height=h;width=w;length=len;int Box volume()/定义计算体积的函数定义计算体积的函数 return(height*width*length);带参数的构造函数带参数的构造函数28int main()Box box1(12,25,30);/建立对象建立对象box1,并指定,并指定box1长、宽、高的值长、宽、高的值 coutThe volume of box1 is box1.volume()endl;Box box2(15,30,21);/建立对象建立对象box2,并指定,并指定box2长、宽、高的值长、宽、高的值 coutThe volume of box2 is box2.volume()endl;return 0;程序运行结果如下:程序运行结果如下:The volume of box1 is 9000The volume of box2 is 9450可以知道:可以知道:(1)带参数的构造函数中的形参,其对应的实参在定义对带参数的构造函数中的形参,其对应的实参在定义对象时给定。象时给定。(2)用这种方法可以方便地实现对不同的对象进行不同的用这种方法可以方便地实现对不同的对象进行不同的初始化。初始化。29C+还提供另一种初始化数据成员的方法还提供另一种初始化数据成员的方法参数初始参数初始化表来实现对数据成员的初始化。这种方法不在函数体内化表来实现对数据成员的初始化。这种方法不在函数体内对数据成员初始化,而是在函数首部实现。例如例对数据成员初始化,而是在函数首部实现。例如例9.2中定中定义构造函数可以改用以下形式:义构造函数可以改用以下形式:Box Box(int h,int w,int len):height(h),width(w),length(len)这种写法方便、简练,尤其当需要初始化的数据成员较多这种写法方便、简练,尤其当需要初始化的数据成员较多时更显其优越性。甚至可以直接在类体中时更显其优越性。甚至可以直接在类体中(而不是在类外而不是在类外)定义构造函数。定义构造函数。用参数初始化表对数据成员初始化用参数初始化表对数据成员初始化30例例9.3在一个类中可以定义多个构造函数,以便对类对象提在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。供不同的初始化的方法,供用户选用。#include using namespace std;class Boxpublic:Box();/声明一个无参的构造函数声明一个无参的构造函数 Box(int h,int w,int len):height(h),width(w),length(len)/声明一个有参的构造函数,用参数的初始化表对数据成员初始化声明一个有参的构造函数,用参数的初始化表对数据成员初始化 int volume();private:int height;int width;int length;Box Box()/定义一个无参的构造函数定义一个无参的构造函数height=10;width=10;length=10;构造函数的重载构造函数的重载31int Box volume()return(height*width*length);int main()Box box1;/建立对象建立对象box1,不指定实参不指定实参coutThe volume of box1 is box1.volume()endl;Box box2(15,30,25);/建立对象建立对象box2,指定指定3个实参个实参coutThe volume of box2 is box2.volume()endl;return 0;/结果:结果:The volume of box1 is 1000 The volume of box2 is 11250在本程序中定义了两个重载的构造函数,其实还可以定义在本程序中定义了两个重载的构造函数,其实还可以定义其他重载构造函数,其原型声明可以为其他重载构造函数,其原型声明可以为Box Box(int h);/有有1个参数的构造函数个参数的构造函数Box Box(int h,int w);/有两个参数的构造函数有两个参数的构造函数在建立对象时分别给定在建立对象时分别给定1个参数和个参数和2个参数。个参数。32构造函数中参数的值既可以通过实参传递,也可以指定为构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。参取默认值。#include using namespace std;class Boxpublic:Box(int h=10,int w=10,int len=10);/在声明构造函数时指定默认参数在声明构造函数时指定默认参数 int volume();private:int height;int width;int length;Box Box(int h,int w,int len)/在定义函数时可以不指定默认参数在定义函数时可以不指定默认参数height=h;width=w;length=len;默认参数的构造函数简化构造函数数默认参数的构造函数简化构造函数数33int Box volume()return(height*width*length);int main()Box box1;/没有给实参没有给实参 coutThe volume of box1 is box1.volume()endl;Box box2(15);/只给定一个实参只给定一个实参coutThe volume of box2 is box2.volume()endl;Box box3(15,30);/只给定只给定2个实参个实参coutThe volume of box3 is box3.volume()endl;Box box4(15,30,20);/给定给定3个实参个实参coutThe volume of box4 is box4.volume()endl;return 0;/程序运行结果为程序运行结果为:The volume of box1 is 1000 The volume of box2 is 1500 The volume of box3 is 4500 The volume of box4 is 900034l 析构函数析构函数(destructor)也是一个特殊的成员函数,它的作也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个用与构造函数相反,它的名字是类名的前面加一个“”符符号。号。l当对象的生命期结束时,会自动执行析构函数。具体地说当对象的生命期结束时,会自动执行析构函数。具体地说如果出现以下几种情况,程序就会执行析构函数:如果出现以下几种情况,程序就会执行析构函数:如果在一个函数中定义了一个对象如果在一个函数中定义了一个对象(它是自动局部对象它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前,当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。自动执行析构函数。如果定义了一个全局对象,则在程序的流程离开其作用如果定义了一个全局对象,则在程序的流程离开其作用域时域时(如如main函数结束或调用函数结束或调用exit函数函数)时,调用该全局对时,调用该全局对象的析构函数。象的析构函数。如果用如果用new运算符动态地建立了一个对象,当用运算符动态地建立了一个对象,当用delete运运算符释放该对象时,先调用该对象的析构函数。它撤销对象算符释放该对象时,先调用该对象的析构函数。它撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。序分配给新对象使用。析构函数析构函数35l 析构函数不返回任何值,没有函数类型,也没有函数参数。析构函数不返回任何值,没有函数类型,也没有函数参数。l 它不能被重载。一个类可以有多个构造函数,但只能有一个它不能被重载。一个类可以有多个构造函数,但只能有一个析构函数。析构函数。l 一般情况下,类的设计者应当在声明类的同时定义析构函数,一般情况下,类的设计者应当在声明类的同时定义析构函数,以指定如何完成以指定如何完成“清理清理”的工作。的工作。l 如果用户没有定义析构函数,如果用户没有定义析构函数,C+编译系统会自动生成一个编译系统会自动生成一个析构函数,但它只是徒有析构函数的名称和形式,实际上什么析构函数,但它只是徒有析构函数的名称和形式,实际上什么操作都不进行。操作都不进行。l 想让析构函数完成任何工作,都必须在定义的析构函数中指想让析构函数完成任何工作,都必须在定义的析构函数中指定。定。36例例9.5 包含构造函数和析构函数的包含构造函数和析构函数的C+程序。程序。#include#includeusing namespace std;class Student /声明声明Student类类public:student(int n,string nam,char s)/定义构造函数定义构造函数num=n;name=nam;sex=s;coutConstructor called.endl;/输出有关信息输出有关信息Student()/定义析构函数定义析构函数coutDestructor called.endl;/输出有关信息输出有关信息void display()/定义成员函数定义成员函数coutnum:numendl;coutname:nameendl;coutsex:sexendlendl;37private:int num;char name10;char sex;int main()Student stud1(10010,Wang_li,f);/建立对象建立对象stud1stud1.display();/输出学生输出学生1的数据的数据 Student stud2(10011,Zhang_fun,m);/定义对象定义对象stud2stud2.display();/输出学生输出学生2的数据的数据return 0;程序运行结果如下:程序运行结果如下:Constructor called.(执行执行stud1的构造函数的构造函数)num:10010 (执行执行stud1的的display函数函数)name:Wang_lisex:fConstructor called.(执行执行stud2的构造函数的构造函数)num:10011 (执行执行stud2的的display函数函数)name:Zhang_funsex:mDestructor called.(执行执行stud2的析构函数的析构函数)Destructor called.(执行执行stud1的析构函数的析构函数)38在一般情况下,调用析构函数的次序正好与调用构造函数在一般情况下,调用析构函数的次序正好

    注意事项

    本文(面向对象程序设计中的概念课件.ppt)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开