欢迎来到163文库! | 帮助中心 精品课件PPT、教案、教学设计、试题试卷、教学素材分享与下载!
163文库
全部分类
  • 办公、行业>
  • 幼教>
  • 小学>
  • 初中>
  • 高中>
  • 中职>
  • 大学>
  • 招考、培训>
  • ImageVerifierCode 换一换
    首页 163文库 > 资源分类 > PPT文档下载
    分享到微信 分享到微博 分享到QQ空间

    C++课件:第4章 类和对象.ppt

    • 文档编号:2039999       资源大小:698KB        全文页数:115页
    • 资源格式: PPT        下载积分:14.5文币     交易提醒:下载本文档,14.5文币将自动转入上传用户(罗嗣辉)的账号。
    微信登录下载
    快捷注册下载 游客一键下载
    账号登录下载
    二维码
    微信扫一扫登录
    下载资源需要14.5文币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    优惠套餐(点此详情)
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、试题类文档,标题没说有答案的,则无答案。带答案试题资料的主观题可能无答案。PPT文档的音视频可能无法播放。请谨慎下单,否则不予退换。
    3、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者搜狗浏览器、谷歌浏览器下载即可。。

    C++课件:第4章 类和对象.ppt

    1、第4章 类和对象第第4章章 类和对象类和对象 4.1 面向对象的思想面向对象的思想4.2 面向对象程序设计的基本特点面向对象程序设计的基本特点 4.3 面向对象的方法面向对象的方法 4.4 面向对象的标记面向对象的标记 4.5 类和对象类和对象 4.6 构造函数和析构函数构造函数和析构函数 4.7 类的组合类的组合 4.8 类模板类模板 第4章 类和对象4.1 面向对象的思想面向对象的思想 C+是一种面向对象的程序设计语言,使用它可以实现面向对象的程序设计。在介绍其面向对象的特性之前,我们先来了解一下面向对象程序设计的特点,以及它与传统的结构化程序设计的联系与本质差别。第4章 类和对象 4.1

    2、.1 结构化程序设计 使用早期的计算机语言编写较大的程序时,由于当时未采用结构化的程序设计方法,使得程序的阅读、理解和调试都非常困难,对程序进行维护或增加新的功能几乎是一件不可能的事情。第4章 类和对象 20世纪60 年代以来,提出了结构化程序设计的概念,它的产生和发展形成了现代软件工程的基础。结构化程序设计建议采用有含义的变量名、实现程序的全局和局部范围以及一种面向过程的自顶向下编程方法,它的基本思想是:自顶向下,逐步求精,将整个程序结构划分成若干个功能相对独立的子模块,并要求这些子模块间的关系尽可能简单;子模块又可继续划分,直至最简;每一个模块最终都可用顺序、选择、循环三种基本结构来实现。

    3、第4章 类和对象 结构化程序设计可以有效地将一个复杂的问题分解为若干个易于处理的子问题,每一个子问题都可以独立地编程解决,从而将整个程序划分成多个子模块或过程,因此,结构化程序设计是一种面向过程的程序设计方法。在结构化程序设计方法中,程序的基本构成单位是函数或者过程。第4章 类和对象 结构化程序设计方法有许多优点:各模块可以分别编写,使得程序更易于阅读、理解、测试和修改;方便增加新的功能模块;功能独立的模块可以组成子程序库,有利于实现软件的复用。结构化程序设计的方法出现之后,立即为广大的程序设计人员所接受并广泛使用,成为程序设计的主流方法。第4章 类和对象 由于结构化程序设计方法是面向过程的,

    4、以解决问题的过程作为程序的基础和重点,因此,在方法上存在着不足。在结构化程序设计中,把程序定义为“数据结构+算法”,数据与处理这些数据的过程是分离的。这样,对不同格式的数据作相同的处理,或是对相同的数据作不同的处理,都需要不同的程序模块来实现,使得程序的可复用性并不好。同时,由于过程和数据相分离,数据可能被多个模块所使用和修改,很难保证数据的安全性和一致性。 第4章 类和对象 4.1.2 面向对象程序设计 面向对象的程序设计技术是完成程序设计任务的一种新方法,它汲取了结构化程序设计中最为精华的部分。“面向对象程序设计是被结构化的结构化程序设计。它是软件开发的第二次变革,是程序结构的统一理论”。

    5、 在面向对象程序设计中,将对象作为构成软件系统的基本单元,并从相同类型的对象中抽象出一种新型的数据结构类。 第4章 类和对象 对象是类的实例。类是一种区别于其它各种一般数据类型的特殊类型。类的成员中不仅包含有描述类对象属性的数据,还包含对这些数据进行处理的程序代码,称之为对象的行为(或操作)。对象将其属性和行为封装在一起,并将其内部大部分的实现细节隐藏起来,仅通过一个可控的接口与外界交互。 面向对象程序设计不仅实现了数据抽象,而且通过抽象出相关类的共性,而形成一般类(基类),并在此基础上,采用继承的方式,对一般类增添不同的特性而派生出多种特殊类(派生类),从而建立了类与类之间的多层结构关系,为

    6、软件复用提供了有效的途径。第4章 类和对象 面向对象程序设计支持多态性。多态性与继承性相结合,使不同结构的对象可以以各自不同的方式响应同一消息。 软件系统的对象之间存在着依存关系,对象之间通过消息联系。面向对象程序设计中,消息表现为对象在起操作过程中对另一个对象的服务程序的调用。第4章 类和对象4.2 面向对象程序设计的基本特点面向对象程序设计的基本特点 4.2.1 抽象性 抽象是指从具体的实例中抽取出共同的性质并加以描述的过程。比起面向过程的程序设计,面向对象程序设计更加强调抽象性。在面向对象方法中,抽象是通过对一个系统进行分析和认识,强调系统中某些本质的特性,而对系统进行的简化描述。第4章

    7、 类和对象 一般,对问题的抽象包括两个方面:数据抽象和行为抽象。数据抽象为程序员提供了对对象的属性和状态的描述,行为抽象则是对这些数据所需要的操作的抽象。 抽象的过程是通过模块化来实现的,即通过分析将一个复杂的系统分解为若干个模块,每个模块是对整个系统结构的某一部分的一个自包含的和完整的描述。同时,对模块中的细节部分进行信息隐藏,用户只能通过一个受保护的接口来访问模块中的数据。这个接口由一些操作组成,定义了该模块的行为。第4章 类和对象 看一个简单的例子。假设我们需要在计算机上实现一个绘制圆形的程序。通过对这个图形的分析,可以看出需要三个数据来描述该圆的位置和大小,即圆心的横、纵坐标以及圆的半

    8、径,这就是对该圆形的数据抽象。另外,该图形应该具有设置圆心坐标、设置半径大小、绘制圆形等功能,这就是对它的行为抽象。用C+语言可以将该图形描述如下:第4章 类和对象圆形 (circle):数据抽象:double x,y,r;行为抽象:setx( );sety( );setr( );draw( );抽象是面向对象方法的核心。第4章 类和对象 4.2.2 封装性 封装是面向对象方法重要的原则。所谓封装,就是将一个事物包装起来,使外界不了解它的详细内情。在面向对象方法中,把某些相关的代码和数据结合在一起,形成一个数据和操作的封装体,这个封装体向外提供一个可以控制的接口,其内部大部分的实现细节则对外隐

    9、藏,从而达到对数据访问权限的合理控制。封装可以使得程序中各部分之间的相互影响达到最小,并且提高程序的安全性,简化代码的编写工作。第4章 类和对象 对象是面向对象程序语言中支持并实现封装的机制。对象中既包含有数据(即属性),又包含有对这些数据进行处理的操作代码(即行为),它们都称为对象的成员。对象中的成员可以定义成公有的或私有的。私有成员即在对象中被隐藏的部分,不能被该对象以外的程序访问;公有成员则提供对象与外界的接口,外界只能通过这个接口与对象发生联系。可以看到,对象有效实现了封装的两个目标对数据和行为的包装和信息隐藏。第4章 类和对象 4.2.3 继承性 继承是软件复用的一种方式,通过继承,

    10、一个对象可以获得另一个对象的属性,并加入属于自己的一些特性。继承提供了创建新类的一种方法,即从现有类创建新类。新类继承了现有类的属性和行为,并通过对这些属性和行为进行扩充和修改,增添自己特有的一些性质。第4章 类和对象 继承简化了人们对系统的认识和描述。我们可以通过对一些有内在联系的类进行分析,抽象出这些类中所包含的共性,从而形成一般类的概念。在一般类的基础上,增添每个具体的类所具有的特性,就形成了各个不同的特殊类。特殊类的对象拥有一般类的全部属性和操作,我们称为特殊类对一般类的继承。在特殊类中,我们不必考虑继承来的属性和行为,只需着重研究它所特有的那些性质就可以了。这就好像在现实世界中,我们

    11、已知房子是建筑物这一概念的继承,则房子这一概念具有建筑物的所有特点,还同时包含有它自身所特有的一些属性。第4章 类和对象 一个一般类可以派生出多个特殊类,不同的特殊类在一般类的基础上增加了不同的特性。一个类也可以继承多个一般类的特性,这称之为多继承。 继承是很重要的概念。继承支持多层分类的概念,使得一个个原来彼此孤立的类有效地组织起来,形成层次结构关系。倘若不使用多层分类的概念,对每个对象的清晰描述都要穷尽其特征,而采用继承的概念描述一个对象,只需在一般类特征的基础上加上该对象的一些专有特性即可。第4章 类和对象 4.2.4 多态性 多态性也是面向对象程序设计的重要特性之一。简单地说,多态性就

    12、是一个接口,多种方式。在基类中定义的属性和操作被派生类继承之后,可能具有不同的数据类型或表现出不同的行为,我们称之为多态性。也就是说,多态性表现为同一属性或操作在一般类及各特殊类中具有不同的语义。从同一基类派生出来的各个对象具有同一接口,因而能响应同一格式的信息,但不同类型的对象对该信息响应的方式不同,导致产生完全不同的行为。在这里,消息一般是指对类的成员函数的调用,而不同的行为即用不同的函数实现。第4章 类和对象 很明显,实现多态性的好处在于,为这类对象提供服务时,不必区分具体是哪种对象,只需发送相同的消息即可,而由各个对象去以适合自身的方式进行不同的响应。 举一个简单的例子。编制绘图程序时

    13、,不同的图形其绘制的方式是不同的。我们可以声明一个基类“几何图形”,该类中定义一个“绘图”行为,并定义该类的派生类“直线”、“椭圆”、“多边形”等,这些类都继承了基类中的“绘图”行为。在基类的“绘图”行为中,由于图形类型尚未确定,所以并不明确定义如何绘制一个图形的方法,而是在各派生类中,根据具体需要对“绘图”重新定义。这样,当对不同对象发出同一“绘图”命令时,各对象调用自己的“绘图”程序实现,绘制出不同的图形。第4章 类和对象4.3 面向对象的方法面向对象的方法 前面我们已经给出了面向对象程序设计的基本思想及其特性,本节将对面向对象的方法做一个更深入的探讨。 要了解面向对象的概念,首先要知道什

    14、么是对象。对象在现实世界中是一个实体或者一种事物的概念。现实世界中的任何一个系统都是由若干具体的对象构成。作为系统的一个组成部分,对象为其所在的系统提供一定的功能,担当一定的角色。所以,对象可以看作是一种具有自身属性和功能的构件。第4章 类和对象 我们在使用一个对象时,并不关心其内部结构及实现方法,仅仅关心它的功能和它在系统中的使用方法,也就是该对象提供给用户的接口。举个例子,对电视机这个对象来说,我们并不关心电视机的内部结构或其实现原理是怎样的,只关心如何通过按钮来使用它。这些按钮就是电视机提供给用户的接口。至于电视机内部结构原理,对用户来说是隐藏的。分析一个系统,也就是分析系统由哪些对象构

    15、成,以及这些对象间的相互关系。第4章 类和对象 我们知道,软件开发的目的是为了进行数据处理,因此,在程序中包含有数据和与之相关的代码。这些数据和对它进行操作的代码是密切相关、不可分离的,没有数据的代码和没有代码的数据同样是没有意义的。 在面向对象方法中,我们采用与现实世界相一致的方式,将对象定义为一组数据及其相关代码的结合体,其中数据描述了对象的属性,对数据进行处理的操作则描述了对象的功能,而软件系统由多个这样的对象构成。对象将其属性和操作的一部分对外界开放,作为它的对外接口,而将大部分的实现细节隐藏,这就是对象的封装性。外界只能使用上述定义的接口与对象交互。第4章 类和对象 面向对象的方法中

    16、进一步引入了类的概念。所谓类,就是同样类型对象的抽象描述。对象是类的实例。类是面向对象方法的核心。对相关的类进行分析,抽取这些类的共同特性,形成基类的概念。通过继承,派生类可以包含基类的所有属性和操作,还可以增加属于自己的一些特性。通过继承,可以将原来一个个孤立的类联系起来,形成清晰的层次结构关系,称为类簇。第4章 类和对象 一个系统由多个对象组成。其中复杂对象可以由简单对象组合而成,称之为聚合。对象之间存在着依存关系,一个对象可以向另一个对象发送消息,也可以从其它对象接收消息,对象之间通过消息彼此联系,共同协作。对象以及对象之间的这种相互作用构成了软件系统的结构。 综上所述,面向对象的方法就

    17、是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。 第4章 类和对象4.4 面向对象的标记面向对象的标记 在面向对象程序设计中,我们可以使用面向对象标记图,将系统的构成更加直观地表述出来。面向对象标记图应该能够准确清楚地描述以下四个问题:类、对象、类及对象的关系、类及对象之间的联系。 面向对象的标记方法有很多种,其中UML(Unified Modeling Language,统一建模语言)是目前国际上确定的标准标记方法。它是一种比较完整的支持可视化建模的工具,但其比较复杂,我们在这里不做介绍。 第4章 类和对象 本节我们介绍一种比较简单和直观的标记方法

    18、Cord/Yourdon标记。Cord/Yourdon标记无法对类和对象的成员的访问控制权限进行有效地描述,但这种标记方法图形简单,易于理解,而且可以清晰地表示出类和对象的相互关系和联系。 Cord/Yourdon标记中有两类图形符号:表示符号和连接符号。表示符号用来表示类和对象。 Cord/Yourdon标记中用一个圆角矩形来表示类。矩形内部分为三个部分,上部是类名,中部表示该类的数据成员,下部则表示该类的成员函数。 第4章 类和对象 图4-1给出了类的标记方法和一个point类的标记实例。point类将在本章的后面部分定义和使用。图4-1 类的标记图 类名数据成员成员函数 pointint

    19、 x,y;point(int,int);point(point);int getx();int gety();第4章 类和对象 对象是类的实例。在Cord/Yourdon标记中,对象是在相应类标记外加一个圆角矩形框,如图4-2所示。p1是point类的一个对象,表示屏幕上的一个点。 图4-2 对象的标记图 对象名数据成员成员函数 p1int x,y;point(int,int);point(point);int getx();int gety();第4章 类和对象 连接符号主要有三种,它们分别表示消息联系、继承关系和包含关系,如图4-3所示。图4-3 Cord/Yourdon标记中的连接符号

    20、第4章 类和对象图4-3 Cord/Yourdon标记中的连接符号 第4章 类和对象 下面给出了一个采用Cord/Yourdon标记描述的关系图,描述了两个类distance类与point类之间的关系。distance类表示屏幕上两个点的距离,该类中包含有两个point类的对象p1和p2。从标记图4-4中可以清楚的看出这两个类之间的组合关系,有关的具体内容将在后续章节介绍。 第4章 类和对象图4-4 distance类与point类的关系图p1int x,y;point(int,int);point(point &);int getx();int gety();p2int x,y;point(

    21、int,int);point(point &);int getx();int gety();distancepoint p1,p2;double dist;distance(point,point)double getdis();第4章 类和对象4.5 类类 和和 对对 象象 类是面向对象程序设计的基础和核心,也是实现数据抽象的工具。在面向过程的结构化程序设计中,组成程序的基本构件是函数。函数由若干相关语句构成,完成对某些数据的处理。由于这些函数和数据之间是相对独立的,使程序修改起来比较麻烦,而且难以保证数据的可靠性和一致性。而在面向对象的程序设计中,将彼此相关的数据和与这些数据相关的操作(函

    22、数)封装在一起,形成类这样一种新的具有更高的集成性和抽象性的数据类型。第4章 类和对象 类实际上相当于一种特殊的用户自定义的数据类型,但它和一般的数据类型有着不同之处:类中不仅包含有一组相关的数据,还包含能对这些数据进行处理的函数。类中的数据具有隐藏性和封装性,类是实现C+的许多高级特性的基础。 我们可以声明属于某个类的变量,这种变量称之为类的对象。在C+中,类和对象的关系实际上是数据类型和具体变量的关系。在程序中可以通过类定义中提供的函数访问该类对象的数据。第4章 类和对象 4.5.1 类的声明 类的声明即类的定义。声明一个类的语法与结构的声明类似,其一般形式如下: class privat

    23、e: public: ; 第4章 类和对象 其中,class是声明类的关键字;是标识符,表示声明的类的名字;类声明体内的函数和变量称为这个类的成员,分别称为成员函数和数据成员;public、private等关键字用来说明类的成员的访问控制属性。 类的成员函数用于对数据成员处理,又称为“方法”。程序中通过类的成员函数来访问其内部的数据成员。成员函数是类与外部程序之间的接口。在类的声明体中只需声明成员函数的原型,成员函数的具体实现可放在类外定义。第4章 类和对象通常采用下面的形式定义成员函数: : () 下面的例子就是一个简单的类的说明。第4章 类和对象【例4-1】 类的声明例题。class my

    24、classprivate: int a;public:void set_a(int num);int get_a( );void myclass:set_a(int num)第4章 类和对象a=num;int myclass:get_a( )return a;第4章 类和对象 4.5.2 类成员的访问控制 在缺省情况下,类中说明的所有函数和变量都为这个类所私有,也就是说,这些函数和变量只能在该类成员函数的实现中被访问。为了说明某些成员是公有成员(可以被其它类的成员访问的成员称为公有成员),必须使用关键字public,并在后面加上冒号。这样,限定词public之后的所有变量和函数不但可以被同一个

    25、类的其它成员访问,还可以被程序中该类以外的对象访问。第4章 类和对象 一般,C+中定义类时,可将类的各个成员划分成不同的访问级别。这可以通过在所说明的成员前面加上访问控制属性来实现。C+规定有三种访问控制属性:public表示成员是公有的,private表示成员是私有的,protected则表示成员是受保护的。第4章 类和对象 公有成员可以由程序中的任何函数访问,而私有成员只允许本类的成员函数访问,任何外部程序对它进行访问都是非法的。可以看到,私有成员是在类中被隐藏的部分,它往往是用来描述该类对象属性的一些数据成员,这些数据成员用户无法访问,只有通过成员函数或某些特殊说明的函数才可引用;而公有

    26、成员一般是成员函数,它提供了外部程序与类的接口功能,用户通过公有成员访问该类对象中的数据。第4章 类和对象 保护成员与私有成员在一般情况下含义相同,它们的区别体现在类的继承中对产生的新类的影响不同。有关保护成员的具体内容将在第7章详细介绍。 上节所定义的类myclass中的数据成员a是一个私有变量,故myclass以外的任何代码都不能访问它;set_a( )和get_a( )是myclass的成员函数,因此它们可以访问a;另外,由于set_a( )和get_a( )被说明为myclass的公有成员,所以允许类以外的其它程序代码调用它们。第4章 类和对象 4.5.3 类的成员函数 类中成员函数的

    27、原型声明写在类定义体内,用以说明该成员函数的形式参数和返回值类型,而成员函数的定义体一般写在类定义之外。同一般函数一样,类的成员函数可以重载,也可以带有缺省的形参值。 例4-1中,若将成员函数set_a( )作如下定义: void myclass:set_a(int num = 10) a=num; 第4章 类和对象 这样,如果在调用这个函数时没有给出实参,程序会把定义中默认的缺省形参值10赋给对象的私有成员a。 在函数中有内联函数的概念。我们可以将那些仅由少数几条简单代码组成,却在程序中被频繁调用的函数定义为内联函数。程序在编译时,将内联函数的函数体插入到每一次调用它的地方。这样,在程序运行

    28、时就省去了调用这些函数引起的开销,提高了程序的执行效率。 第4章 类和对象 我们同样可以将类中的成员函数定义为内联函数,为此可采用如下两种方式: 将成员函数的函数体直接放在类声明中。 使用inline关键字来限定,即在类定义体中说明函数原型时前面加上inline,或者在类定义体外定义这个函数时前面加上inline。 是否将一个成员函数定义为内联函数是由这个函数的复杂性决定的。 第4章 类和对象【例4-2】 类的成员函数的定义例题。class rectangleprivate:int x,y,weight,high;public:void move(int xx,int yy) x = xx;

    29、y = yy;void size(int w,int h) weight = w; high = h;void where(int& xx,int& yy) xx = x; yy= y;int area( ); 第4章 类和对象;int rectangle:area( )return weight * high;第4章 类和对象 4.5.4 对象 前面我们声明了一个类myclass,但并没有创建它的任何对象,仅仅是定义了即将创建的对象的类型。要真正创建该类型的对象,必须进行对象说明。说明一个对象的方法与说明一般变量的方法相同。下面的例子定义了myclass类的两个对象: myclass ob1

    30、, ob2; 类和对象的关系相当于普通数据类型与其变量的关系。 第4章 类和对象 类是一种逻辑抽象概念。声明一个类只是定义了一种新的数据类型,对象说明才真正创建了这种数据类型的物理实体。由同一个类创建的各个对象具有完全相同的数据结构,但它们的数据值可能不同。 一旦创建了一个类的对象,程序就可以用运算符“.”来引用类的公有成员,其引用形式如下: 或 第4章 类和对象 假设已经说明了对象ob1、ob2和整型变量value,下面的语句完成对ob1和ob2成员函数set_a( )与get_a( )的调用: ob1.set_a(20); ob2.set_a(99); value = ob2.get_a(

    31、 ); cout ob1.get_a( );第4章 类和对象 需要注意,只有用public定义的公有成员才能使用圆点操作符访问。对象中的私有成员是类中隐藏的数据,不允许在类外的程序中被直接访问,只能通过该类的公有成员函数来访问它们。请判断下面的语句哪些是错误的: ob1.a = 10; /错误!a是私有成员 ob2.a = ob1.a; /错误!a是私有成员ob2.set_a(ob1.get_a( ); /正确!set_a( )和get_a( )都是公有成员 另外,C+中允许同属一个类的两个对象之间相互赋值。 第4章 类和对象 ob1 = ob2; 会将对象ob2的所有数据成员的值完全复制到对

    32、象ob1的相应成员中去。 但是在有些情况下,对象间的相互赋值存在着潜在的危险。比如,类中包含有指针类型的数据成员时,对象的整体赋值会使两个不同对象中的指针成员指向同一内存空间,使用时须非常小心。第4章 类和对象 4.5.5 对象数组 数组的元素可以是基本类型的数据,也可以是用户自定义类型的数据,对象数组就是指数组元素为对象的数组。对象数组中的各个元素必须是属于同一个类的若干对象。 对象数组的定义和使用与一般数组类似。不同的是,对象数组的每个元素都是对象,其中不仅包含数据成员,还包含有成员函数。所以,对象数组的使用有其特殊之处。第4章 类和对象 声明对象数组的一般形式如下: 下标表达式 其中,指

    33、出该对象数组元素所属的类; 给出数组的维数和大小。例如,声明语句 myclass obs10; 定义了一个一维的对象数组obs,该数组有10个元素,每个元素都是myclass类的对象。 又例如: myclass obs235;第4章 类和对象 表明obs2是一个二维对象数组,包含15个属于myclass类的对象。 声明了对象数组之后,就可以引用其数组元素。该数组元素是一个对象,故只能访问其公有成员。引用数组元素的一般形式如下: 下标 例如: obs6. set_a(60); cout obs3. get_a(60); 对象数组允许被赋初值,也允许被赋值。 第4章 类和对象【例4-3】 对象数组

    34、例题。#include class dateprivate:int year,month,day;public:date( int y,int m,int d );void print( );第4章 类和对象date:date(int y=2000, int m=1, int d=1 )year = y;month = m;day = d;void date:print( )cout year . month . day endl;void main( )第4章 类和对象 date days4=date(2001,8,11),date(2001,8,12),date(2001,8,13),da

    35、te(2001,8,14);for (int i=0; i4; i+)daysi.print( ); 程序运行结果为 2001.8.11 2001.8.12 2001.8.13 2001.8.14第4章 类和对象4.6 构造函数和析构函数构造函数和析构函数 4.6.1 构造函数 构造函数是在类中声明的一种特殊的成员函数,作用是在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的状态。 构造函数的名字与它所属的类名相同,被声明为公有函数,且没有任何类型的返回值,在创建对象时被自动调用。第4章 类和对象 构造函数作为类的一个成员函数,具有一般成员函数所有的特性,它可以访问类的所有数据成员,

    36、可以是内联函数,可以带有参数表,还可以带默认的形参值。构造函数也可以重载,以提供初始化类对象的不同方法。 下面的例子说明了构造函数的定义和使用。 第4章 类和对象【例4-4】 构造函数例题。#include class dateprivate:int year, month, day;public:date( int y, int m, int d );void print( );第4章 类和对象date:date(int y, int m, int d )year = y;month = m;day = d;cout constructor called endl;void date:pri

    37、nt( )cout year . month . day endl;第4章 类和对象void main( )date today(2001,8,11), tomorrow(2001,8,12);cout today is ;today.print( );cout tomorrow is ;tomorrow.print( );第4章 类和对象 程序运行结果为 constructor called constructor called today is 2001.8.11 tomorrow is 2001.8.12 说明:本程序在date类中定义了一个带参数的构造函数。从运行结果可以看出,当主程序

    38、中声明两个date类的对象today和tomorrow时,构造函数被自动调用两次。由于该构造函数带有形参,故在对象声明时必须通过实参给出初始值。 第4章 类和对象 每个类都必须有构造函数,若类定义时没有定义任何构造函数,编译器会自动生成一个不带参数的缺省构造函数,其形式如下: : ( ) /. 缺省构造函数名与类名相同。第4章 类和对象 4.6.2 拷贝构造函数 我们常常希望用一个已有对象来构造同一类型的另一对象,这可以通过调用一种特殊的构造函数拷贝构造函数来实现。 拷贝构造函数是重载构造函数的一种重要形式,它的功能是使用一个已经存在的对象去初始化一个新创建的同类的对象,它可以将一个已有对象的

    39、数据成员的值拷贝给正在创建的另一个同类的对象。第4章 类和对象 例如,已经有了一个date类的对象today,然后希望生成一个和它一样的对象workday,我们可用以下形式实现: date today(2001, 8, 11); date workday(today); 在创建对象workday时,系统调用拷贝构造函数,将对象today的每个数据成员的值都复制到workday中,使两者具有同样的值。第4章 类和对象 拷贝构造函数实际上也是构造函数,具有一般构造函数的所有特性,其名字也与所属类名相同。拷贝构造函数中只有一个参数,这个参数是对某个同类对象的引用。 定义拷贝构造函数的一般形式如下:

    40、class class_name private: public: class_name(形式参数表);第4章 类和对象class_name(class_name &ob_name); class_name:class_name(class_name &ob_name); 函数体第4章 类和对象例如,对前面定义的date类可以增添拷贝构造函数如下:class dateprivate:int year, month, day;public:date( int y, int m, int d ); /构造函数date( date &day); /拷贝构造函数void print( ); 第4章 类

    41、和对象date:date(date &myday)year = myday.year;month = myday.month;day = myday.day; 第4章 类和对象 拷贝构造函数在三种情况下会被调用: 用类的一个对象去初始化该类的另一个对象时。 函数的形参是类的对象,调用函数进行形参和实参的结合时。 函数的返回值是类的对象,函数执行完返回调用者时。第4章 类和对象【例4-5】 拷贝构造函数的使用例题。#include class pointprivate:int x, y; public:point(int xx = 0, int yy = 0) x = xx; y = yy;po

    42、int(point &p);第4章 类和对象int get_x( ) return x;int get_y( ) return y;point:point(point &p)x = p.x;y = p.y;cout 拷贝构造函数被调用 endl;void f ( point p)第4章 类和对象cout p.get_x( ) p.get_y( ) endl;point g ( )point a(7, 33);return a;void main ( )point a(15, 22);point b( a );第4章 类和对象cout b.get_x( ) b.get_y( ) endl;f (

    43、b);b = g ( );cout b.get_x( ) b.get_y( ) endl;程序的运行结果为拷贝构造函数被调用15 22拷贝构造函数被调用15 22拷贝构造函数被调用7 33第4章 类和对象 说明:此程序中定义了一个point类,表示屏幕上一个点。类中两个私有成员x和y,分别为该点的横、纵坐标,类中分别定义了构造函数和拷贝构造函数。主程序中,当声明对象a时,系统调用了构造函数初始化其值,而当声明对象b时,则调用拷贝构造函数,将其值初始化为同a一样的值,属于拷贝构造函数调用的第一种情况。 第4章 类和对象 主程序中调用函数f(其形参是一个point类的对象),进行形参与实参的结合,

    44、这时系统再次调用拷贝构造函数,将对象b的值拷贝到形参p中,这是拷贝构造函数调用的第二种情况。函数g的返回值是一个point类的对象,系统为该返回值创建一个临时对象,并调用拷贝构造函数将局部对象a的值拷贝至其中,函数g运行结束后,将此临时对象的值赋与对象b,这是拷贝构造函数调用的第三种情况。第4章 类和对象 最后需要说明的是,每一个类都必须有一个拷贝构造函数,但不是都必须要自己定义。如果我们在类中没有定义,则系统会自动帮我们定义一个默认的拷贝构造函数,该函数自动完成将一个对象的所有数据成员复制到另一个对象中的所有操作。比如,如果我们没有为上述的date类定义拷贝构造函数,系统会自动创建一个拷贝构

    45、造函数,其功能与我们定义的一样。第4章 类和对象 4.6.3 析构函数 一个对象失效时,要调用该对象所属类的析构函数。析构函数的功能是用来释放一个对象的。析构函数本身并不实际删除对象,而是进行系统放弃对象内存之前的清理工作,使内存可用来保存新的数据。它与构造函数的功能正好相反。 析构函数也是类的成员函数,它的名字是在类名前加字符“”。析构函数没有参数,也没有返回值。析构函数不能重载,也就是说,一个类中只可能定义一个析构函数。 第4章 类和对象 析构函数可以在程序中被调用,也可由系统自动调用。在函数体内定义的对象,当函数执行结束时,该对象所在类的析构函数会被自动调用。用new运算符动态创建的对象

    46、,在使用delete运算符释放它时,也会 自动调用其析构函数。 同样,如果一个类中没有定义析构函数,系统也会为它自动生成一个默认的析构函数。该析构函数是一个空函数,什么都不做。第4章 类和对象【例4-6】 构造函数和析构函数例题。#include class myclassprivate:int a;public:myclass( ) cout constructor endl; a = 10;myclass( ) cout destructor endl;第4章 类和对象void show( ) cout a endl;void main( )myclass ob;ob.show( );程序

    47、的运行结果为constructor10destructor第4章 类和对象 析构函数通常用于对象退出生命期时,释放这个对象所占用的一些资源。例如,某个对象在运行程序过程中申请了一些内存空间,则需要在对象结束生命期前将这些空间释放;或者在打开了某个文件或数据库时,需要在对象退出生命期前关闭这些文件或数据库。 第4章 类和对象4.7 类类 的的 组组 合合 在现实世界中,我们解决复杂的问题时,通常采用将其层层分解为简单问题的方法。即可将一个复杂的问题分解为几个较简单的子问题描述出来,而这些子问题又可以进一步分解,由更简单的子问题来描述。这样,只要这些最基本、最简单的子问题得以描述和解决,由它们构成

    48、的复杂问题就迎刃而解了。第4章 类和对象 同样的思想可应用于面向对象的程序设计方法中。确定一个对象的内部结构可能是很困难的一件事,但我们可以通过将复杂对象层层分解为若干简单的“部件”对象的组合,然后再由这些易于描述和实现的部件对象来“装配”复杂对象。 C+中允许将一个已定义的类的对象作为另一个类的数据成员,这称之为类的组合。即类可以将其它类对象作为自己的成员,形成一种包含和被包含的关系。例如: 第4章 类和对象Class Aprivate: public: ;Class Bprivate: A a;第4章 类和对象 public: ; 其中,B类中的数据成员a就是一个A类的对象,称之为对象成员

    49、。 在定义一个类时,其数据成员既可以是简单类型,又可以是自定义类型,还可以是类的对象。这样,我们定义类时,就可以利用已定义的类来构成新类,由若干结构简单、易于实现的类来构造复杂的类。这种类似于部件组装的方法,不仅简化了问题的描述,而且有利于提高软件的开发效率,也是软件复用的一种形式。第4章 类和对象 对组合类,当创建该类的对象时,其中包含的各个对象成员也将被自动创建。故该类的构造函数应包含对其中对象成员的初始化。通常采用成员初始化列表的方法来初始化对象成员。在成员初始化列表中,既包含对对象成员的初始化,又包含对本类中其它的基本数据成员的初始化。下面通过一个例子简单说明成员初始化列表的构造。第4

    50、章 类和对象【例4-7】 类的组合例题。#include class Aprivate:int a1, a2;public:A(int i, int j) a1=i, a2=j;void print( ) couta1,a2endl;class B第4章 类和对象private:A a;int b;public:B(int i, int j, int k): a(i,j), b(k) void print( );void B:print( )a.print( );cout b endl;第4章 类和对象void main( )B b(3, 4, 5);b.print( );在该程序中,B类中包


    注意事项

    本文(C++课件:第4章 类和对象.ppt)为本站会员(罗嗣辉)主动上传,其收益全归该用户,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!




    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库