面向对象程序设计 ch2.ppt
《面向对象程序设计 ch2.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计 ch2.ppt(107页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第2章章从结构到类的演变从结构到类的演变结构类型简称为结构(结构类型简称为结构(struct),结构不仅是构造类结构不仅是构造类型的重要成员,也是类的前身。型的重要成员,也是类的前身。C+中的结构与中的结构与C中的结构已经发生了质的变化。中的结构已经发生了质的变化。本章首先使用结构编制一个本章首先使用结构编制一个C+的面向过程的典型的面向过程的典型程序,并通过实例简要说明结构如何向类变化,从程序,并通过实例简要说明结构如何向类变化,从而引入对象和类的知识。而引入对象和类的知识。然后介绍两个类,通过使用这两个类,进一步熟悉然后介绍两个类,通过使用这两个类,进一步熟悉类和对象,为学习面向对象编程
2、打下基础。类和对象,为学习面向对象编程打下基础。主要内容主要内容2.1 结构的演化结构的演化2.2 从结构演变一个简单的类从结构演变一个简单的类2.3 C+面向对象程序设计特点面向对象程序设计特点2.4 数据对象和数据类型数据对象和数据类型2.5 熟悉并使用类和对象熟悉并使用类和对象2.6 string对象数组与范型算法对象数组与范型算法2.7 结构化程序设计典型例题结构化程序设计典型例题2.8 活捉臭虫保平安活捉臭虫保平安2.1结构的演化结构的演化结构由若干元素构成,结构由若干元素构成,C语言中称这些结构元素为结构成语言中称这些结构元素为结构成员,员,C+中称为数据成员。不过,能够做数据成员
3、的不只中称为数据成员。不过,能够做数据成员的不只是基本数据类型的变量,还可以是构造类型(数组、指针是基本数据类型的变量,还可以是构造类型(数组、指针甚至是其他类型的结构)变量。甚至是其他类型的结构)变量。在在C+中,定义结构变量时,可以省略关键字中,定义结构变量时,可以省略关键字struct,而而且且C+的结构中可以有函数。其实,类确实是从结构演变的结构中可以有函数。其实,类确实是从结构演变而来,开始称为而来,开始称为“带类的带类的C”。这场革命就是从让结构含这场革命就是从让结构含有函数开始的。有函数开始的。本节从结构引入类,然后练习如何使用系统提供的类,以本节从结构引入类,然后练习如何使用系
4、统提供的类,以便为设计类打下基础。便为设计类打下基础。2.1.1结构发生质的演变结构发生质的演变1.函数与数据共存函数与数据共存C+允许结构中可以定义函数,这些函数称为成员函数。允许结构中可以定义函数,这些函数称为成员函数。如果将原来的结构成员称为数据成员的话,可以使用如下如果将原来的结构成员称为数据成员的话,可以使用如下的形式描述:的形式描述:struct结构名结构名数据成员数据成员成员函数成员函数;可以像结构变量或指针使用结构成员那样,使用成员可以像结构变量或指针使用结构成员那样,使用成员函数:函数:结构变量结构变量.成员函数成员函数指向结构变量指针的名字指向结构变量指针的名字-成员函数成
5、员函数假设为结构假设为结构Point设计一个设计一个Setxy函数如下:函数如下:voidSetxy(doublea,doubleb)x=a;y=b;如果把域如果把域x和和y称为结构的数据成员,则可以使用参数称为结构的数据成员,则可以使用参数表中的表中的a和和b赋给结构变量的数据成员。假设有对象赋给结构变量的数据成员。假设有对象a,则语句:则语句:a.Setxy(12.5,14.5);使结构变量使结构变量a的的a.x=125,a.y=14.5。【例【例2.1】结构中使用成员函数的实例。结构中使用成员函数的实例。#includeusingnamespacestd;structPointvoidS
6、etxy(doublea,doubleb)/成员函数,用来成员函数,用来/重新设置数据成员重新设置数据成员x=a;y=b;voidDisplay()/成员函数,按指定格式输出成员函数,按指定格式输出/数据成员的值数据成员的值coutxtyDisplay();/使用指向变量使用指向变量a的指针调用成员函数的指针调用成员函数coutxtyendl;程序运行结果如下:程序运行结果如下:10.618.510.618.510.618.5主程序中的变量是通过结构的成员函数使用数据成员,但主程序中的变量是通过结构的成员函数使用数据成员,但最后一条语句则是直接使用数据成员。这称作结构最后一条语句则是直接使用数
7、据成员。这称作结构Point的公有的公有(public)性质。性质。2.封装性封装性所谓封装性,就是限制存取权限(详见后面的所谓封装性,就是限制存取权限(详见后面的2.3.3节)。节)。如果在定义结构时,将数据成员使用如果在定义结构时,将数据成员使用private关键字定义,关键字定义,则产生封装性则产生封装性。【例【例2.2】使结构具有封装性的实例。】使结构具有封装性的实例。#includeusingnamespacestd;structPointprivate:doublex,y;/数据成员数据成员public:voidSetxy(doublea,doubleb)/成员函数成员函数/用来重
8、新设置数据成员用来重新设置数据成员x=a;y=b;voidDisplay()/成员函数,按指定格式成员函数,按指定格式/输出数据成员的值输出数据成员的值coutxtyendl;显然,没有使用显然,没有使用private定义的成员函数,默认为定义的成员函数,默认为public(也可以直接使用也可以直接使用public)。这时,如果还使用【例这时,如果还使用【例2.1】的】的主程序,则其最后一条语句就出现编译错误。也就是说,主程序,则其最后一条语句就出现编译错误。也就是说,私有的数据成员,必须通过公有的成员函数才能使用,这私有的数据成员,必须通过公有的成员函数才能使用,这就称为数据的封装性。显然,
9、没有使用就称为数据的封装性。显然,没有使用private定义的成定义的成员函数,默认为员函数,默认为public(也可以直接使用也可以直接使用public)。这时,如果还使用这时,如果还使用【例【例2.1】的主程序,则其最后一条语的主程序,则其最后一条语句就出现编译错误。也就是说,私有的数据成员,必须通句就出现编译错误。也就是说,私有的数据成员,必须通过公有的成员函数才能使用,这就称为数据的封装性。其过公有的成员函数才能使用,这就称为数据的封装性。其实,这就变成了具有类的性质的结构。只是类使用关键字实,这就变成了具有类的性质的结构。只是类使用关键字class定义,它默认的是定义,它默认的是pr
10、ivate。确实,类当初就是从这确实,类当初就是从这种结构演变的。种结构演变的。2.1.2使用构造函数初始化结构的对象使用构造函数初始化结构的对象因为因为【例【例2.2】的程序使结构具有封装性,所以不能使用的程序使结构具有封装性,所以不能使用初始化列表初始化结构对象。为此,这里为结构初始化列表初始化结构对象。为此,这里为结构Point设设计两个专门用于初始化的函数。这两个函数具有相同的名计两个专门用于初始化的函数。这两个函数具有相同的名字字Point,其原型如下:其原型如下:Point();Point(double,double);从第从第1章的知识可知,这是函数重载。因为这里的函数名章的知识
11、可知,这是函数重载。因为这里的函数名与结构同名,所以称为构造函数。构造函数专门用于初始与结构同名,所以称为构造函数。构造函数专门用于初始化对象。化对象。【例【例2.3】使用构造函数初始化对象的实例。使用构造函数初始化对象的实例。#includeusingnamespacestd;structPointprivate:doublex,y;/数据成员数据成员public:Point();/无参数构造函数无参数构造函数Point(doublea,doubleb)/具有两个参数的构造函具有两个参数的构造函数数x=a;y=b;voidSetxy(doublea,doubleb)/成员函数,用来重成员函数
12、,用来重新设置数据成员新设置数据成员x=a;y=b;voidDisplay()/成员函数,按指定格式输出数据成员的值成员函数,按指定格式输出数据成员的值coutxtyendl;voidmain()Pointa;/定义对象定义对象aPointb(18.5,10.6);/定义对象定义对象b并赋初值并赋初值a.Setxy(10.6,18.5);/设置变量设置变量a的数据成员的数据成员a.Display();/显示变量显示变量a的数据成员的数据成员b.Display();/显示变量显示变量b的数据成员的数据成员程序运行结果如下:程序运行结果如下:10.618.518.510.6现在不要深究构造函数的原
13、理,只要记住它的使用方法即现在不要深究构造函数的原理,只要记住它的使用方法即可。一般形式为:可。一般形式为:构造函数名构造函数名对象名(初始化参数);对象名(初始化参数);程序在运行时,会自动完成初始化任务。例如语句程序在运行时,会自动完成初始化任务。例如语句Pointb(18.5,10.6);使得使得a.x=18.5,a.y=10.6。2.2从结构演变一个简单的类从结构演变一个简单的类其实,使用关键字其实,使用关键字class代替代替struct,就是一个就是一个标准的类。标准的类。【例【例2.4】定义类的实例。】定义类的实例。classPointprivate:doublex,y;/类类p
14、oint的数据成员的数据成员public:Point();/类类Point的无参数构造函数的无参数构造函数Point(doublea,doubleb)/具有两个参数的构造函数具有两个参数的构造函数x=a;y=b;voidSetxy(doublea,doubleb)/成员函数,用来成员函数,用来/重新设置数据成员重新设置数据成员num=a;score=b;voidDisplay()/成员函数,按指定格成员函数,按指定格/式输出数据成员的值式输出数据成员的值coutxtyendl;使用类产生对象的方式如结构一样,可以使用如下的主函使用类产生对象的方式如结构一样,可以使用如下的主函数,将得到相同的运
15、行结果。数,将得到相同的运行结果。voidmain()Pointa;/定义类定义类Point的对象的对象aPointb(18.5,10.6);/定义类定义类Point的对象的对象b并初始化并初始化a.Setxy(10.6,18.5);/为对象为对象a的数据成员赋值的数据成员赋值a.Display();/显示对象显示对象a的数据成员的数据成员b.Display();/显示对象显示对象b的数据成员的数据成员程序运行结果如下:程序运行结果如下:10.618.518.510.6可以将可以将point类看作直角坐标系的点类,图类看作直角坐标系的点类,图2.1是是point类类的示意图。的示意图。图图2.
16、1point类示意图类示意图提供的操作提供的操作构造函数构造函数PointSetxy用来给对象赋值用来给对象赋值Display用来输出用来输出x和和y第第1个方框中是类名,第个方框中是类名,第2个方框中是坐标点的数据,称为个方框中是坐标点的数据,称为属性(或称数据成员)。第属性(或称数据成员)。第3个方框中表示类所提供的具个方框中表示类所提供的具体操作方法,实际上是如何使用数据体操作方法,实际上是如何使用数据x和和y,以实现预定功以实现预定功能的函数,这里称为成员函数。能的函数,这里称为成员函数。用用point类产生对象类产生对象a,而使用语句而使用语句a.set(10.6,18.5);可以设
17、置对象可以设置对象a的数据成员分别为的数据成员分别为10.6和和18.5,也就是坐,也就是坐标点(标点(10.6,18.5),这就是一个具体的坐标点,即类),这就是一个具体的坐标点,即类point的一个对象。使用带参数构造函数的一个对象。使用带参数构造函数Pointb(18.5,10.6);则将其坐标初始化为则将其坐标初始化为(18.5,10.6)的点对象的点对象b。2.3C+面向对象程序设计特点面向对象程序设计特点面向对象的程序设计方法要求语言必须具备抽象、封装、面向对象的程序设计方法要求语言必须具备抽象、封装、继承和多态性等关键要素。继承和多态性等关键要素。2.3.1对象对象称现实世界中客
18、观存在的事物为对象,如前所述,整数是称现实世界中客观存在的事物为对象,如前所述,整数是一个对象,平面上的点是一个对象,河流湖泊都是对象。一个对象,平面上的点是一个对象,河流湖泊都是对象。复杂的对象可以由简单的对象组成,例如火车站对象又包复杂的对象可以由简单的对象组成,例如火车站对象又包含售票处、行李房、信号灯、站台、铁轨和通信设施等对含售票处、行李房、信号灯、站台、铁轨和通信设施等对象。这些对象各自又由许多对象组成,对象各自完成特定象。这些对象各自又由许多对象组成,对象各自完成特定的功能。总之,世界万物皆对象。的功能。总之,世界万物皆对象。售票处有各种规格的车票,这些车票表示售票处的静态特售票
19、处有各种规格的车票,这些车票表示售票处的静态特征。它提供发售车票的功能征。它提供发售车票的功能(操作操作),表示了售票处的动态,表示了售票处的动态特征。特征。通过这种抽象归纳,通过这种抽象归纳,C+可使用对象名、属性和操作三可使用对象名、属性和操作三要素来描述对象。要素来描述对象。对象名用来标识一个具体对象。用数据来表示对象的属对象名用来标识一个具体对象。用数据来表示对象的属性,一个属性就是描述对象静态特征的一个数据项。性,一个属性就是描述对象静态特征的一个数据项。操作是描述对象动态特征(行为)的一个函数序列(使操作是描述对象动态特征(行为)的一个函数序列(使用函数实现操作),也称为方法或服务
20、。用函数实现操作),也称为方法或服务。数据称为数据成员,函数称为成员函数。数据称为数据成员,函数称为成员函数。由此可见,由此可见,C+中的对象是系统中用来描述客观事物的中的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位。一个对象由一一个实体,是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的成员函数构成。对象结组属性和对这组属性进行操作的成员函数构成。对象结构如图构如图2.2所示。所示。对象名属性1属性2属性n操作1操作2操作n图图2.2对象结构图对象结构图【例【例2.5】用简单对象表示平面上的用简单对象表示平面上的A(3.5,6.4)和和B(8.5,8.9)
21、两个坐标点。可使用图两个坐标点。可使用图2.3表示具体对象表示具体对象A和和B的对象结构。的对象结构。Bx(8.5)y(8.9)display();setxy();move();Ax(3.5)y(6.4)display();setxy();move();图图2.3 具体对象具体对象A和和B的结构图的结构图图中含义解释如下:图中含义解释如下:对象名是对象名是“A”,A是一个点的对象。没有给对象是一个点的对象。没有给对象A的属的属性赋值时,这只是个抽象名词。只有具有确定的属性值,性赋值时,这只是个抽象名词。只有具有确定的属性值,才是一个具有确定位置的点。才是一个具有确定位置的点。图图2.3中用中用
22、x坐标和坐标和y坐标表示坐标点对象的静态属性坐标表示坐标点对象的静态属性(称为位置属性)。(称为位置属性)。假设假设x和和y可以取实数值,可以取实数值,C+中使用中使用float标记它们是实标记它们是实数,不同属性值用来区分对象数,不同属性值用来区分对象A和和B。假设暂且让点对象对外有显示属性值、设置属性值和移假设暂且让点对象对外有显示属性值、设置属性值和移动位置等操作,这里分别使用成员函数动位置等操作,这里分别使用成员函数display,setxy,move来实现这些操作。来实现这些操作。2.3.2抽象和类抽象和类抽象是一种从一般的观点看待事物的方法,即集中于事物抽象是一种从一般的观点看待事
23、物的方法,即集中于事物的本质特征,而不是具体细节或具体实现。的本质特征,而不是具体细节或具体实现。面向对象鼓励程序员以抽象的观点看待程序,即程序是由面向对象鼓励程序员以抽象的观点看待程序,即程序是由一组抽象的对象组成的。一组抽象的对象组成的。另外,又可以将一组对象的共同特征进一步抽象出来,从另外,又可以将一组对象的共同特征进一步抽象出来,从而形成而形成“类类”的概念。例如,从点的概念。例如,从点A和和B抽象出点的概念,抽象出点的概念,这就是这就是“点类点类”。这个类的本质是具有两个坐标属性和对这两个属性值进行这个类的本质是具有两个坐标属性和对这两个属性值进行操作的方法。操作的方法。A和和B的区
24、别只是属性值的不同,其方法是的区别只是属性值的不同,其方法是相同的。例如,当它们使用移动位置的函数之后,点的位相同的。例如,当它们使用移动位置的函数之后,点的位置属性值将随之变化。置属性值将随之变化。它们都从当前位置移到一个新位置,代表了新坐标处的点它们都从当前位置移到一个新位置,代表了新坐标处的点对象。通过分析一组对象对象。通过分析一组对象(A和和B),抽取公共的行为将其放抽取公共的行为将其放入到一个类中,取名为入到一个类中,取名为Point类,并用图类,并用图2.4的的Point类模类模型表示它。型表示它。Point float x;float y;display();setxy();mo
25、ve();图图2.4 类类Point的结构图的结构图 它也由类名、一组属性和一组操作等它也由类名、一组属性和一组操作等3部分组成。类的属部分组成。类的属性只是性质的说明,对象的属性才是具体的数据。所以,性只是性质的说明,对象的属性才是具体的数据。所以,图图2.4的的Point类只是表示类名是类只是表示类名是Point,它的点位置是两它的点位置是两个实数,但还没有具体的位置。只有像本节个实数,但还没有具体的位置。只有像本节A和和B两点两点那样,具有确定的属性值,才是那样,具有确定的属性值,才是Point类的具体对象,称类的具体对象,称它为类它为类Point的一个实例。从图的一个实例。从图2.4可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计 ch2 面向 对象 程序设计
限制150内