面向对象程序设计教程(C++语言描述课件

上传人:文**** 文档编号:241969379 上传时间:2024-08-08 格式:PPT 页数:167 大小:594.66KB
返回 下载 相关 举报
面向对象程序设计教程(C++语言描述课件_第1页
第1页 / 共167页
面向对象程序设计教程(C++语言描述课件_第2页
第2页 / 共167页
面向对象程序设计教程(C++语言描述课件_第3页
第3页 / 共167页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第1章 面向对象程序设计概论,面向对象程序设计教程(C+语言描述)上,面向对象程序设计教程(C+语言描述)上,第1章 面向对象程序设计概论,1.1,程序设计方法,1.2,面向对象程序设计的基本概念,1.3,面向对象程序设计语言,1.4,C+对面向对象程序设计方法的支持,1.5,C+程序的实现,第1章 面向对象程序设计概论1.1 程序设计方法,1.1 程序设计方法,1.1.1,结构化程序设计方法,1.1.2,面向对象的程序设计方法,返回首页,目前有两种重要的程序设计方法:,1.1 程序设计方法1.1.1 结构化程序设计方法返回首,1.1.1,结构化程序设计方法,结构化程序设计的概念由瑞士计算机科学家1971年首次提出来,随之出现了支持结构化程序设计方法的程序设计语言,例如C语言。,结构化程序设计方法:,强调程序结构的规范性,强调程序设计的自顶向下,逐步求精的演化过程。在这种方法中,待解问题和程序设计语言中的过程紧密相联。,1.1.1 结构化程序设计方法 结构化程序设计的概,1.1.1 结构化程序设计方法,例如要开发一个成绩管理系统,由于问题较复杂,我们将待解的问题分解成若干子问题:,输入成绩,处理成绩,打印成绩,待解问题将对应到main()函数,每个子问题对应到main()的调用函数,1.1.1 结构化程序设计方法 例如要开发一个成绩管理系统,1.1.1 结构化程序设计方法,返回本节,随着程序规模与复杂性的增长,面向过程的结构化程序设计方法存在明显的不足之处:,数据安全性问题,可维护性及可重用性差,图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。,1.1.1 结构化程序设计方法返回本节 随着程序,1.1.2 面向对象程序设计方法,在结构化程序设计方法中,程序可表示为:,程序=数据结构+算法,即程序的要素是数据结构和算法,数据结构是指利用计算机的离散逻辑来量化表达需要解决的问题,而算法则研究如何高效而快捷地组织解决问题的具体过程。,1.1.2 面向对象程序设计方法在结构化程序设计方法中,程,1.1.2 面向对象程序设计方法,【例1.1】用C+语言描述,用结构化程序设计方法计算矩形的面积。,1.1.2 面向对象程序设计方法【例1.1】用C+语言描,1.1.2 面向对象程序设计方法,在面向对象的程序设计方法中,对象是数据结构和算法的封装体。,根据这个定义,对象是计算机内存中的一块区域。在对象中,不但存有数据,而且存有代码,使得每个对象在功能上相互之间保持相对独立。当然,对象之间存在各种联系,但它们之间只能通过消息进行通信。程序可表示为:,程序=对象+消息,1.1.2 面向对象程序设计方法 在面向对象的程序设,1.1.2 面向对象程序设计方法,【例1.2】用C+语言描述,用面向对象程序设计方法计算矩形的面积。,1.1.2 面向对象程序设计方法【例1.2】用C+语言描,1.1.2 面向对象程序设计方法,通过这个程序可以知道面向对象程序程序的基本结构。一般情况下,面向对象程序都是由三个部分来构成:类的声明、类的成员的实现和主函数。,可见,在面向对象程序设计中,它着重于类的设计。类正是面向对象语言的基本程序模块,通过类的设计,来完成实体的建模任务。,1.1.2 面向对象程序设计方法 通过这个程序可以知,1.1.2 面向对象程序设计方法,程序Li1_2比程序Li1_1看起来要烦琐一些。但是,如果以RectangleArea类为基础,通过继承,可以很方便地派生出长方体等新的几何体,实现代码重用。,面向对象程序设计方法提供了软件重用、解决大问题和复杂问题的有效途径,具有抽象性、封装性、继承性和多态性等特点。,返回本节,1.1.2 面向对象程序设计方法 程序Li1_2比程,1.2 面向对象程序设计的基本概念,1.2.1,抽象,1.2.2 封装,1.2.3 消息,1.2.4 继承,1.2.5 多态,返回首页,1.2 面向对象程序设计的基本概念1.2.1 抽象返回,1.2.1 抽象,抽象就是忽略事物中与当前目标无关的非本质特征,而强调与当前目标有关的本质特征,从而找出事物的共性,并把具有共性的事物划为一类,得到一个抽象的概念。,1.2.1 抽象 抽象就是忽略事物中与当前目标无关的,1.2.1 抽象,面向对象方法中的抽象:指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。,它包括两个方面:数据抽象和行为抽象(或称功能抽象、代码抽象)。其中,数据抽象描述某类对象共有的属性或状态,行为抽象描述某类对象的共有的行为或功能特征。将这两方面抽象有机地结合,就形成了面向对象程序设计中的“对象”。还可以继续抽象:把众多相似的“对象”聚集起来,进一步抽象后就形成了“类”。,1.2.1 抽象 面向对象方法中的抽象:指对具体问题(,1.2.1 抽象,数据抽象:,float length,width,Area;,行为抽象:,SetData(float L,float W);,CompueteArea();,OutputArea();,分析程序清单Li1_2:,如果不是计算矩形的面积,关注的特征可能是颜色、大小等。由此可见,对于同一个研究对象,由于所研究问题的侧重点不同,就可能产生不同的抽象结果。,返回本节,1.2.1 抽象数据抽象:分析程序清单Li1_2:如果不是,1.2.2 封装,在日常生活中,我们往往只想知道某件物品的功能,而不关心它是怎么工作的。,对于程序设计亦是如此,当人们面对某段程序时,只关心它的执行结果,而不关心实现过程以及过程中所用到的数据。封装恰好满足了这一需求。,1.2.2 封装 在日常生活中,我们往往只想知道某件,1.2.2 封装,面向对象方法中的封装:就是将抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。,封装有两个含义:一是把对象的全部属性和行为结合在一起,形成一个不可分割的独立单位。对象的私有属性只能由这个对象的行为来读取和修改;二是尽可能隐蔽对象的内部细节,对外形成一道屏障,通过公有行为充当外部接口。,1.2.2 封装 面向对象方法中的封装:就是将抽象出,1.2.2 封装,例如程序段Li1_2中的类RectangleArea就是在抽象的基础上,将矩形的数据和功能结合起来而构成的封装体。,声明的私有成员length、width和Area外部无法直接访问,外界可通过公有行为SetData()、CompueteArea()和OutputArea()与类RectangleArea发生联系。,返回本节,1.2.2 封装 例如程序段Li1_2中的类Rect,1.2.3 消息,消息:是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。,前面所提到的“接口”规定了能向某一对象发出什么请求。也就是说,类对每个可能的请求都定义了一个相关的函数,当向对象发出请求时,就调用这个函数。这个过程通常概括为向对象“发送消息”(提出请求),对象根据这个消息决定做什么(执行函数代码)。,1.2.3 消息 消息:是面向对象程序设计用来描述对,1.2.3 消息,例如,外界与RectangleArea类进行通信,可以通过下面的C+语句来描述:,/创建一个Rectangle对象,RectangleArea Rectangle;,/通过对象调用CompueterArea()函数,Rectangle.CompueterArea();,返回本节,1.2.3 消息例如,外界与RectangleArea类进,1.2.4 继承,在客观世界中,存在着一般和特殊的关系,特殊具有一般的特性,同时又有自己的新特性。,运用抽象的原则就是舍弃对象的特殊性,提取其一般性,从而得到适合一个对象集的类。如果在这个类的基础上,再考虑抽象过程中被舍弃的一部分对象的特性,则可形成一个新的类,这个类具有前一个类的全部特征,又有自己的新特征,形成一种层次结构,即继承结构。,1.2.4 继承 在客观世界中,存在着一般和特殊的关,1.2.4 继承,面向对象程序设计中利用继承机制将这种关系模型化。继承就是指特殊类的对象拥有其一般类的属性和行为。,1.2.4 继承 面向对象程序设计中利用继承机制将这,1.2.4 继承,在软件开发过程中,继承进一步实现了软件模块的可重用性。继承意味着“自动地拥有”,即特殊类中不必重新定义已在一般类中定义过的属性和行为,而是自动地、隐含地拥有其一般类的属性与行为。当这个特殊类又被它更下层的特殊类继承时,它继承来的和自己定义的属性和行为又被下一层的特殊类继承下去。不仅如此,如果将开发好的类作为构件放到构件库中,在开发新系统时便可直接使用或继承使用。,返回本节,1.2.4 继承 在软件开发过程中,继承进一步实现了,1.2.5 多态,面向对象的通信机制是消息,一个消息可以产生不同的响应效果,这种现象叫做多态。即一个名字,多种语义;或相同界面,多种实现。,1.2.5 多态 面向对象的通信机制是消息,一个消息,1.2.5 多态,例如,如果发送消息“双击”,不同的对象就会有不同的响应。比如,“文件夹”对象收到双击消息后,会打开该文件夹,而“音乐文件”对象收到双击消息后,会播放该音乐。显然,打开文件夹和播放音乐需要不同的函数体。但是,它们可以被同一条消息“双击”所引发。这就是多态。,返回本节,1.2.5 多态 例如,如果发送消息“双击”,不同的,1.3 面向对象程序设计语言,1.3.1,混合型的面向对象程序设计语言C+,1.3.2 纯面向对象程序设计语言Java,返回首页,1.3 面向对象程序设计语言1.3.1 混合型的面向对象,1.3.1混合型的面向对象程序设计语言C+,混合型程序设计语言兼有同时支持面向过程的程序设计和支持面向对象的程序设计的特点,C+语言是这类语言的典型代表。,1.3.1混合型的面向对象程序设计语言C+混合型程,1.3.1混合型的面向对象程序设计语言C+,C+语言具有4个方面的优点:,降低程序开发和维护的成本。,与C兼容,但比用C语言编写的程序更有效率。,允许程序员更自由地使用各种库。,C+的异常处理机制能够保证在运行期间检查到错误,并转至相应的处理程序,减少了代码的长度和复杂度。,返回本节,1.3.1混合型的面向对象程序设计语言C+C+语言具有4,1.3.2 纯面向对象程序设计语言Java,Java是一种具有“简单、面向对象的、分布式、解释型、健壮、安全、与体系结构无关、可移植、高性能、多线程和动态执行”等特性的语言。其次,它最大限度地利用了网络,Java的应用程序(Applet)可在网络上传输,可以说是网络世界的通用语言;另外,Java还提供了丰富的类库,使程序设计者可以方便地建立自己的系统。因此Java具有强大的图形、图像、动画、音频、视频、多线程及网络交互能力,使其在设计交互式、多媒体网页和网络应用程序方面大显身手。,Java是C+的简化和改进,因而C+程序员可以很快掌握Java编程技术。,返回本节,1.3.2 纯面向对象程序设计语言Java Java,1.4 C+对面向对象程序设计方法的支持,C+作为一种面向对象程序设计语言,支持面向对象技术的,抽象性,、,继承性,、,封装性,和,多态性,等特性。,返回首页,1.4 C+对面向对象程序设计方法的支持 C+作,1.4 C+对面向对象程序设计方法的支持,1,支持抽象性,C+把问题域中的事物抽象成对象(Object),用数据成员描述该对象的静态特征(属性),用成员函数来刻画该对象的动态特征(行为)。,返回本节,1.4 C+对面向对象程序设计方法的支持1支持抽象性返,1.4 C+对面向对象程序设计方法的支持,2,支持继承性,C+语言允许单继承和多继承。继承是面向对象语言的重要特性。C+允许从一个或多个已经定义的类中派生出新的类并继承其数据和操作,同时在新类中可以重新定义或增加新的数据和操作,从而建立起类的层次结构。被继承的类称为基类或父类,派生的新类称为派生类或子类。,返回本节,1.4 C+对面向对象程序设计方法的支持 2支持继承性,1.4 C+对面向对象程序设计方法的支持,3,支持封装性,在C+语言中,类是支持数据封装的工具,对象是数据封装的实现。C+将数据和相关操作封装在类中,同时通过访问权限来控制对内部数据的访问。,返回本节,1.4 C+对面向对象程序设计方法的支持3支持封装性返,1.4 C+对面向对象程序设计方法的支持,4,支持多态性,C+多态分为编译时多态和运行时多态。对编译时多态的支持是通过函数重载和运算符重载实现的;对运行时多态的支持是通过继承和虚函数来实现的。,返回本节,1.4 C+对面向对象程序设计方法的支持4支持多态性返,1.5,C+,程序的实现,返回首页,1.5.1,编辑C+源程序,1.5.2 编译和连接源程序,1.5.3 运行源程序,1.5 C+程序的实现 返回首页1.5.1 编辑C+,第2章 从C到C+,2.1,C+程序基本组成,2.2,简单的输入/输出,2.3,指针与引用,2.4,函数,2.5,new和delete运算符,2.6 其他若干重要的C+特性,2.7 应用实例,第2章 从C到C+2.1 C+程序基本组成,2.1 C+程序基本组成,返回首页,2.1.1,C+程序基本结构,2.1.2 C+程序基本组成,2.1 C+程序基本组成返回首页2.1.1 C+程,2.1.1,C+,程序基本结构,一般情况下,用C+语言编写的程序是由函数加上类组成的。,两种退化情形:,程序中仅有类而没有函数(包括没有主函数)。通常是用来构造C+程序库,供编程序时重用。,另一种退化情形是程序中仅有函数而没有类。除主函数外,还可能有一些游离的函数,这些游离的函数不属于任何类。,返回本节,2.1.1 C+程序基本结构 一般情况下,用C+,2.1.2 C+,程序基本组成,【例2.1】一个最简单的C+程序。,2.1.2 C+程序基本组成【例2.1】一个最简单的C,2.1.2 C+,程序基本组成,分析程序Li1_1.cpp:,1.文件包含命令(#include指令),文件包含命令,即#include指令,其作用是将某一个源文件的代码并入当前源程序。其形式有两种:,#include,一般用于C+提供的库函数。C+编译程序按标准方式搜索,即系统到存放C+库函数头文件的include子目录中寻找要包含的文件。,2.1.2 C+程序基本组成分析程序Li1_1.cpp,2.1.2 C+,程序基本组成,#include“文件名”,这种形式一般用于程序员自己开发的模块。C+编译程序首先在当前工作目录中搜索,若没有,再按标准方式搜索。,2.1.2 C+程序基本组成,2.1.2 C+,程序基本组成,程序Li2_1.cpp中的第1行代码,#include 是编译预处理中的文件包含命令,它的作用是在编译之前将文件iostream的内容增加到源程序Li2_1.cpp该命令所在的地方。文件iostream设置了C+的I/O相关环境,定义了输入输出流类对象cout与cin等,程序要在屏幕上输入/输出时,需要包含该文件。,2.1.2 C+程序基本组成 程序Li2_1.cpp,C+编译系统提供的头文件有两类:,一类是标准的C+库头文件,这些头文件不带“.h”;这种写法也适合标准的C库头文件,但是必须使用前缀字符“c”。例如:,#include/相当于#include,另一类是非准的C+库头文件,这些头文件带“.h”。在连接时,编译系统会根据头文件名自动确定连接哪一个库。,2.1.2 C+,程序基本组成,使用标准C+库时,在所有的include指令之后,需要加入语句:,using namespace std;,C+编译系统提供的头文件有两类:2.1.2 C+程序,2,针对名字空间的指令,一个软件往往由多个模块组合而成,其中包括由不同的程序员开发的组件及类库提供的组件,这样不同模块间在对标识符命名时就有可能发生命名冲突,简单地说,就是在不同的模块中使用相同名字表示不同的事物,这样当然会引起程序出错。C+提供名字空间来防止命名的冲突。,2.1.2 C+,程序基本组成,2针对名字空间的指令2.1.2 C+程序基本组成,2.1.2 C+,程序基本组成,程序Li2_1.cpp中的语句,using namespace std;,是针对名字空间的指令。告诉编译程序此程序中所有的标识符都在std名字空间中,标识符都可以直接使用而不会发生命名的冲突。,2.1.2 C+程序基本组成 程序Li2_1.cpp,2.1.2 C+,程序基本组成,代码段,int main(),couthello,students!变量1变量2变量n;,其中,cin是预定义的标准输入流对象,是输入操作符,也称提取运算符。,返回本节2.2.1 键盘输入 在C+中输入操作可理,2.2.2 屏幕输出,在C+中输出操作可理解为将数据插入到输出流对象中,故称为插入操作。屏幕输出是标准输出操作,用来将表达式的结果输出到显示器的屏幕上。其一般形式可表示为:,cout表达式1表达式2表达式n;,其中,cout是预定义的标准输出流对象,”访问对象指针的成员:,-,-(),或者,(*).,(*).(),3.2.3 对象成员的访问用成员选择运算符“-”访问对象,3.2.3 对象成员的访问,【例3.4】利用例3.3中定义的类,示例对象的声明和对成员访问方法。,返回本节,3.2.3 对象成员的访问【例3.4】利用例3.3中定义的,3.3 构造函数与析构函数,返回首页,3.3.1,构造函数,3.3.2 析构函数,3.3.3 拷贝构造函数,3.3 构造函数与析构函数返回首页3.3.1 构造函数,3.3.1 构造函数,对象的数据成员反映了该对象的内部状态,但在类声明中,无法用表达式初始化这些数据成员,因而数据成员的初始值是不确定的。,在声明对象的时候进行的数据成员设置,称为对象的初始化。在特定对象使用结束时,还经常需要进行一些清理工作。C+程序中的初始化和清理工作,分别由两个特殊的成员函数来完成,即构造函数与析构函数。,3.3.1 构造函数 对象的数据成员反映了该对象的内,3.3.1 构造函数,构造函数的特点,构造函数是一种特殊的成员函数,对象的创建和初始化工作可以由它来完成,其格式如下:,:(),函数体,3.3.1 构造函数构造函数的特点,3.3.1 构造函数,构造函数应该被声明为公有函数,因为它是在创建对象的时侯被自动调用。,构造函数特点:,函数名与类名相同,可以重载,不能指定返回类型,不能被显式调用,3.3.1 构造函数 构造函数应该被声明为公有函数,,3.3.1 构造函数,2.,默认构造函数,默认构造函数就是无参数的构造函数。既可以是自己定义的,也可以是编译系统自动生成的。,当没有为一个类定义任何构造函数的情况下,编译系统就会自动生成一个无参数、空函数体的默认构造函数。其格式如下:,:(),3.3.1 构造函数2.默认构造函数,3.3.1 构造函数,【例3.5】修改例3.2中定义的类,示例构造函数的用法。,返回本节,3.3.1 构造函数【例3.5】修改例3.2中定义的类,示,3.3.2 析构函数,1.析构函数的特点,析构函数也是一种特殊的成员函数,它的作用是在对象消失时执行一项清理任务,例如,可以用来释放由构造函数分配的内存等。其格式如下:,:(),函数体,3.3.2 析构函数1.析构函数的特点,3.3.2 析构函数,析构函数也只能被声明为公有函数。析构函数有如下特点:,析构函数的名字同类名,与构造函数名的区别在于析构函数名前加,表明它的功能与构造函数的功能相反,析构函数没有参数,不能重载,一个类中只能定义一个析构函数,不能指定返回类型,析构函数在释放一个对象时侯被自动调用。它能被显式调用,但不提倡。,3.3.2 析构函数 析构函数也只能被声明为,3.3.2 析构函数,2默认析构函数,如果一个类中没有定义析构函数时,系统将自动生成一个默认析构函数,其格式如下:,:(),3.3.2 析构函数2默认析构函数,3.3.2 析构函数,【例3.6】修改例3.2中定义的类,示例析构函数的用法。,/程序Li3_6.cpp 点类的界面部分,返回本节,3.3.2 析构函数【例3.6】修改例3.2中定义的类,示,3.3.3 拷贝构造函数,1.拷贝构造函数的特点,拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象。为了保证所引用的对象不被修改,通常把引用参数声明为const参数。其格式为:,:(const&),函数体,3.3.3 拷贝构造函数1.拷贝构造函数的特点,3.3.3 拷贝构造函数,拷贝构造函数具有一般构造函数的特性,其特点如下:,拷贝构造函数名字与类相同,不能指定返回类型,拷贝构造函数只有一个参数,该参数是该类的对象的引用,它不能被显式调用。,在以下3种情况下会被自动调用:,3.3.3 拷贝构造函数 拷贝构造函数具有一,3.3.3 拷贝构造函数,当用类的一个对象去初始化该类的另一个对象时,当函数的形参是类的对象,进行形参和实参结合时,当函数的返回值是类的对象,函数执行完成返回调用者时,3.3.3 拷贝构造函数 当用类的一个对象去初始化该类的另,3.3.3 拷贝构造函数,2默认拷贝构造函数,如果一个类中没有定义拷贝构造函数,则系统自动生成一个默认拷贝构造函数。该函数的功能是将已知对象的所有数据成员的值拷贝给对应的对象的所有数据成员。,3.3.3 拷贝构造函数 2默认拷贝构造函数,3.3.3 拷贝构造函数,【例3.7】分析下面程序的执行过程,了解拷贝构造函数的用法。,返回本节,3.3.3 拷贝构造函数【例3.7】分析下面程序的执行过程,3.4 this指针,同一类的各个对象创建后,都在类中产生自己成员的副本。对象在副本中与成员函数建立关系是通过C+为成员函数提供的一个称为this的指针来进行的。,当创建一个对象时,this指针就初始化指向该对象。当某一对象调用一个成员函数时,this指针将作为一个变元自动传给该函数。所以,不同的对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象的数据成员。,3.4 this指针 同一类的各个对象创建后,都在,3.4 this指针,this指针是由C+编译器自动产生且较常用的一个隐含对象指针,它不能被显式声明。,this指针是一个局部量,局部于某个对象。,this指针是一个常量,它不能作为赋值、递增、递减等运算的目标对象。,只有非静态类成员函数才拥有this指针,并通过该指针来处理对象。,3.4 this指针 this指针是由C+编译器自动产,3.4 this指针,【例3.8】分析下面程序,体会this指针的隐式使用,3.4 this指针【例3.8】分析下面程序,体会thi,3.4 this指针,【例3.9】分析程序结果,体会this指针的显式使用。,返回首页,3.4 this指针【例3.9】分析程序结果,体会thi,3.5 子对象和堆对象,返回首页,3.5.1,子对象,3.5.2 堆对象,3.5 子对象和堆对象 返回首页3.5.1 子对象,3.5.1 子对象,一个对象作为另一个类的成员时,该对象称为类的子对象。子对象实际上是某个类的数据成员。说明形式为:,class ,;,3.5.1 子对象 一个对象作为另一个类的成,3.5.1 子对象,class A,;,class B,private:,A a;,;,例如:,3.5.1 子对象class Aclass B例如:,3.5.1 子对象,2.,子对象的初始化,为初始化子对象,X的构造函数要调用这些对象成员所在类的构造函数,于是X类的构造函数中就应包含数据成员初始化列表,用来给子对象进行初始化。,3.5.1 子对象2.子对象的初始化,3.5.1 子对象,X类的构造函数的定义形式如下:,:():(),(),,(),3.5.1 子对象X类的构造函数的定义形式如下:,3.5.1 子对象,对子对象的构造函数的调用顺序取决于这些子对象在类中说明的顺序,与它们在成员初始化列表中给出的顺序无关。,当建立X类的对象时,先调用子对象的构造函数,初始化子对象,然后才执行X类的构造函数,初始化X类中的其他成员。,3.5.1 子对象 对子对象的构造函数的调用,3.5.1 子对象,【例3.10】分析下面程序中构造函数与析构函数的调用顺序。,3.5.1 子对象【例3.10】分析下面程序中构造函数与析,3.5.1 子对象,Whole类的缺省构造函数没有给出成员初始化列表,这表明子对象将使用缺省构造函数进行初始化。,例如:,int main(),Whole w;/调用缺省构造函数,return 0;,3.5.1 子对象 Whole类的缺省构造函数,3.5.1 子对象,程序的输出为:,Default constructor of Part,Default constructor of Part,Destructor of Whole,Destructor of Part,0,Destructor of Part,0,在这种情况下,Whole类必须定义一个缺省构造函数,3.5.1 子对象程序的输出为:在这种情况下,Whole,3.5.1 子对象,该例类Whole中数据成员只含有2个子对象,它的构造函数的成员初始化列表中含有2个对子对象进行初始化的选项。如果该类中还有其他数据成员,其初始化也可通过成员初始化列表进行。,例如:,3.5.1 子对象 该例类Whole中数据成,3.5.1 子对象,class Whole,public:,Whole(int i);,Whole();,Whole();,private:,Part p1;,Part p2;,int data;,;,3.5.1 子对象class Whole,3.5.1 子对象,为了初始化数据成员data,这时该构造函数也可以定义成如下格式:,Whole:Whole(int i,j):p1(),p2(i),data(j),返回本节,3.5.1 子对象 为了初始化数据成员dat,3.5.2 堆对象,堆对象:是在程序运行时根据需要随时可以被创建或删除的对象。,在虚拟的程序空间中存在一些空闲存储单元,这些空闲存储单元组成所谓的堆。,C+程序的内存格局通常分为4个区:,数据区,代码区,栈区,堆区(即自由存储区),3.5.2 堆对象堆对象:是在程序运行时根据需要随时可以被,3.5.2 堆对象,1.使用运算符new创建堆对象,使用new运算符可以动态地创建对象,即堆对象。,使用语法为:,new (),例如:,HeapObjectClass*pa;,pa=new(3,7);,3.5.2 堆对象1.使用运算符new创建堆对象,3.5.2 堆对象,2.使用运算符delete删除堆对象,该运算符专门用来释放由运算符new所创建的对象。,其使用语法为:,delete ,例如:,delete pa;,3.5.2 堆对象2.使用运算符delete删除堆对象,3.5.2 堆对象,【例3.11】分析下列程序的输出结果,注意运算符new和delete的用法。,3.5.2 堆对象【例3.11】分析下列程序的输出结果,注,3.5.2 堆对象,3.使用运算符new 创建对象数组,其使用语法为:,new ,其中,给出数组的大小,后面不能再跟构造函数参数,所以,从堆上分配对象数组,只能调用默认的构造函数,不能调用其他任何构造函数。例如:,ObjectArrayClass*ptr;,ptr=new HeapObjectClass 15;,3.5.2 堆对象3.使用运算符new 创建对象数组,3.5.2 堆对象,4.使用运算符delete 删除对象数组,其格式如下:,delete ,其中,必须是指向new 所创建的对象数组,且必须是new 所返回的值。,3.5.2 堆对象4.使用运算符delete 删除,3.5.2 堆对象,【例3.12】分析下列程序的输出结果,注意运算符new 和delete 的用法。,3.5.2 堆对象【例3.12】分析下列程序的输出结果,注,3.6 类的静态成员,返回首页,3.6.1,静态数据成员,3.6.2 静态成员函数,3.6 类的静态成员 返回首页3.6.1 静态数据成员,3.6.1 静态数据成员,静态成员是指声明为static的类成员,包括静态数据成员和静态成员函数,在类的范围内所有对象共享该数据。,静态数据成员不属于任何对象,它是类定义的一部分。类中的静态数据成员不同于一般的静态变量,也不同于其他的类数据成员。它在程序开始运行时创建而不是在对象创建时创建。它所占空间的回收也不是在析构函数时进行而是在程序结束时进行。,3.6.1 静态数据成员 静态成员是指声明为stat,3.6.1 静态数据成员,1.,静态数据成员的初始化,必须对静态数据成员进行初始化,因为只有这时编译程序才会为静态数据成员分配一个具体的作储空间。,静态数据成员的初始化与一般数据成员不同,它的初始化不能在构造函数中进行。,静态数据成员初始化的格式为:,:=;,3.6.1 静态数据成员1.静态数据成员的初始化,3.6.1 静态数据成员,2.,静态数据成员的引用,静态数据成员可说明为公有的、私有的、或保护的。若为公有的可直接访问,引用静态数据成员的格式为:,:,3.6.1 静态数据成员2.静态数据成员的引用,3.6.1 静态数据成员,【例,3.13,】用静态数据成员的控制点类,每次只允许一个对象访问。,3.6.1 静态数据成员【例3.13】用静态数据成员的控制,3.6.1 静态数据成员,【例3.14】统计点类的对象数,示例静态数据成员的记数作用。,返回本节,3.6.1 静态数据成员【例3.14】统计点类的对象数,示,3.6.2 静态成员函数,静态成员函数的定义和其他成员函数一样。在一般函数定义前加上static关键字。,调用静态成员函数的格式为:,:();,或,.();,3.6.2 静态成员函数 静态成员函数的定义,3.6.2 静态成员函数,【例3.15】改写例3.14,用静态成员函数输出点类的对象数。,3.6.2 静态成员函数【例3.15】改写例3.14,用静,3.6.2 静态成员函数,【例3.16】用静态成员函数输出点的位置。,返回本节,3.6.2 静态成员函数【例3.16】用静态成员函数输出点,3.7 类的友元,返回首页,3.7.1,友元函数,3.7.2 友元类,3.7 类的友元返回首页3.7.1 友元函数,3.7.1 友元函数,在类里声明一个普通函数,加上关键字friend,就成了该类的友元函数,它可以访问该类的一切成员。其原型为:,friend ();,友元函数声明的位置可在类的任何部位,既可在pubic区,也可在protected区。其实现放在类的外部。,3.7.1 友元函数 在类里声明一个普通函数,加上关,3.7.1 友元函数,【例3.17】用友元函数求两点的距离。,返回本节,3.7.1 友元函数【例3.17】用友元函数求两点的距离。,3.7.2 友元类,一个类可被声明为另一个类的友元,该类被称为友元类。,假设有类A和类B,若在类B的定义中将类A声明为友元,那么,类A被称作类B的友元类,它所有的成员函数都可以访问类B中的任意成员。,友元类的声明为:,friend;,3.7.2 友元类 一个类可被声明为另一个类,3.7.2 友元类,例3.18中,将整个教师类teacher看成是学生类student的友元类,教师可以给学生设置学号,输入学生成绩。,【例3.18】示例友元类的使用,返回本节,3.7.2 友元类例3.18中,将整个教师类teacher,3.8 应用实例,返回首页,用面向对象的方法重新编写一个学生成绩管理程序。要求能添加、编辑、查找、删除学生有关信息。,目的:区分面向过程与掌握面向对象的思想,掌握面向对象的思路及基本概念。,3.8 应用实例 返回首页 用面向对象的方法重新编写,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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