收藏 分享(赏)

面向对象C++ 第二章.ppt

上传人:dzzj200808 文档编号:3371277 上传时间:2018-10-20 格式:PPT 页数:47 大小:170.50KB
下载 相关 举报
面向对象C++ 第二章.ppt_第1页
第1页 / 共47页
面向对象C++ 第二章.ppt_第2页
第2页 / 共47页
面向对象C++ 第二章.ppt_第3页
第3页 / 共47页
面向对象C++ 第二章.ppt_第4页
第4页 / 共47页
面向对象C++ 第二章.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、第2章 从结构到类的演变,2.1 结构的演化 2.2 从结构演变一个简单的类 2.3 C+面向对象程序设计特点 2.4 数据对象和数据类型 2.5 熟悉并使用类和对象 2.6 string对象数组与范型算法 2.7 结构化程序设计典型例题 2.8 活捉臭虫保平安,2.1 结构的演化结构由若干元素构成,C语言中称这些结构元素为结构成员,C+中称为数据成员。能够做数据成员的不只是基本数据类型的变量,还可以是构造类型(数组、指针甚至是其他类型的结构)变量。 C+的结构中可以有函数。其实,类确实是从结构演变而来,开始称为“带类的C”。这场革命就是从让结构含有函数开始的。,2.1.1 结构发生质的演变

2、1. 函数与数据共存 C+允许结构中可以定义函数,这些函数称为成员函数。如果将原来的结构成员称为数据成员的话,可以使用如下的形式描述:struct 结构名 数据成员成员函数;可以像结构变量或指针使用结构成员那样,使用成员函数:结构变量.成员函数指向结构变量指针的名字 - 成员函数, 假设为结构Point设计一个Setxy函数如下:void Setxy(double a, double b) x=a; y=b; 如果把域x和y称为结构的数据成员,则可以使用参数表中的a和b赋给结构变量的数据成员。假设有对象(结构变量)a,则语句:a.Setxy(12.5,14.5); 使结构变量a的a.x=125

3、, a.y=14.5。,【例2.1】结构中使用成员函数的实例。 #include using namespace std; struct Point double x, y; /数据成员void Setxy(double a, double b) /成员函数,用来/重新设置数据成员x=a; y=b;void Display() /成员函数,按指定格式输出/数据成员的值coutx“t“yendl;,void main( ) struct Point a,*p; /定义变量和指针变量a.Setxy(10.6,18.5); /设置变量a的数据成员a.Display(); /显示变量a的数据成员p=

4、程序运行结果如下: 10.6 18.5 10.6 18.5 10.6 18.5主程序中的变量是通过结构的成员函数使用数据成员,但最后一条语句则是直接使用数据成员。这称作结构 Point的公有(public)性质。,2. 封装性 所谓封装性,就是限制存取权限。如果在定义结构时,将数据成员使用private关键字定义,则产生封装性。【例2.2】使结构具有封装性的实例。 #include using namespace std; struct Point private:double x, y; /数据成员,public:void Setxy(double a, double b) /成员函数/用来

5、重新设置数据成员x=a; y=b;void Display() /成员函数,按指定格式/输出数据成员的值coutx“t“yendl; ;没有使用private定义的成员函数,默认为public(也可以直接使用public)。这时,如果还使用【例2.1】的主程序,则其最后一条语句就出现编译错误。也就是说,私有的数据成员,必须通过成员函数才能使用,这就称为数据的封装性。,2.1.2 使用构造函数初始化结构的对象因为【例2.2】的程序使结构具有封装性,所以不能使用初始化列表初始化结构对象。为此,这里为结构Point设计两个专门用于初始化的函数。这两个函数具有相同的名字Point,其原型如下:Poin

6、t();Point(double,double);这是函数重载。因为这里的函数名与结构同名,称为构造函数。构造函数专门用于初始化对象。,【例2.3】使用构造函数初始化对象的实例。 #include using namespace std; struct Pointprivate: double x, y; /数据成员public:Point(); /无参数构造函数Point(double a, double b) /具有两个参数的构造函数x=a; y=b;void Setxy(double a, double b) /成员函数,用来重新设置数据成员x=a; y=b;,void Display(

7、) /成员函数,按指定格式输出数据成员的值coutx“t“yendl; ; void main( ) Point a; /定义对象aPoint b(18.5 , 10.6); /定义对象b并赋初值a.Setxy(10.6,18.5); /设置变量a的数据成员a.Display(); /显示变量a的数据成员b.Display(); /显示变量b的数据成员 程序运行结果如下: 10.6 18.5 18.5 10.6,现在不深究构造函数的原理,只要记住它的使用方法即可。一般形式为:构造函数名 对象名(初始化参数); 程序在运行时,会自动完成初始化任务。例如语句Point b(18.5 , 10.6)

8、; 使得a.x=18.5,a.y=10.6。,2.2 从结构演变一个简单的类,其实,使用关键字class代替struct,就是一个标准的类。 【例2.4】定义类的实例。 class Point private:double x, y; /类point的数据成员,public:Point(); /类Point的无参数构造函数Point(double a, double b) /具有两个参数的构造函数x=a; y=b;void Setxy(double a, double b) /成员函数,用来/重新设置数据成员num=a; score=b;void Display() /成员函数,按指定格/式输

9、出数据成员的值coutx“t“yendl; 使用类产生对象的方式如结构一样,可以使用如下的主函数,将得到相同的运行结果。,void main( ) Point a; /定义类Point的对象aPoint b(18.5 , 10.6); /定义类Point的对象b并初始化a.Setxy(10.6,18.5); /为对象a的数据成员赋值a.Display(); /显示对象a的数据成员b.Display(); /显示对象b的数据成员 程序运行结果如下: 10.6 18.5 18.5 10.6 可以将point类看作直角坐标系的点类,2.3 C+面向对象程序设计特点 面向对象的程序设计方法要求语言必须

10、具备抽象、封装、继承和多态性等关键要素。 2.3.1 对象现实世界中客观存在的事物为对象。复杂的对象可以由简单的对象组成,例如火车站对象又包含售票处、行李房、信号灯、站台、铁轨和通信设施等对象。这些对象各自又由许多对象组成,对象各自完成特定的功能。总之,世界万物皆对象。售票处有各种规格的车票,这些车票表示售票处的静态特征。它提供发售车票的功能(操作),表示了售票处的动态特征。,通过这种抽象归纳,C+可使用对象名、属性和操作三要素来描述对象。 对象名用来标识一个具体对象。用数据来表示对象的属性,一个属性就是描述对象静态特征的一个数据项。 操作是描述对象动态特征(行为)的一个函数序列(使用函数实现

11、),也称为方法或服务。 数据称为数据成员,函数称为成员函数。由此可见,C+中的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的成员函数构成。,图2.2对象结构图,【例2.5】用简单对象表示平面上的A(3.5,6.4)和B(8.5,8.9)两个坐标点。可使用图2.3表示具体对象A和B的对象结构。,对象名是“A”,A是一个点的对象。没有给对象A的属性赋值时,这只是个抽象名词。只有具有确定的属性值,才是一个具有确定位置的点。图中用x坐标和y坐标表示坐标点对象的静态属性(称为位置属性)。假设让点对象对外有显示属性值、设置属性值和移动位置等操作,

12、这里分别使用成员函数display, setxy, move来实现这些操作。,2.3.2 抽象和类抽象是一种从一般的观点看待事物的方法,即集中于事物的本质特征,而不是具体细节或具体实现。面向对象鼓励程序员以抽象的观点看待程序,即程序是由一组抽象的对象(类)组成的。可以将一组对象的共同特征进一步抽象出来,从而形成“类”的概念。例如,从点A和B抽象出点的概念,这就是“点类”。,图2.4 类Point的结构图,类由类名、一组属性和一组操作等3部分组成。类的属性只是性质的说明,对象的属性才是具体的数据。所以,图2.4的Point类只是表示类名是Point,它的点位置是两个实数,但还没有具体的位置。只有

13、像本节A和B两点具有确定的属性值,才是Point类的具体对象,称它为类Point的一个实例。,图2.5 类模型的结构图,对于一个具体的类,它有许多具体的个体,这些个体叫做“对象”。举个例子,“人”是一个类,具有“直立行走、会使用工具”等一些区别于其他事物的共同特征;而张三、李四、王五等一个个具体的人,就是“人”这个类的一个个“对象”,同一类的不同对象具有相同的行为方式(如张三和李四都能直立行走、会使用工具),不同类的对象具有不同的行为。类的作用是定义对象。类和对象的关系如同一个模具与用这个模具铸造出来的铸造件之间的关系。类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的实体。所以,

14、C+中将对象称做类的一个实例。,在程序中,每个对象需要有自己的存储空间以保存它们自己的属性值。所谓“一个类的所有对象具有相同的属性”,是指属性的个数、名称、数据类型相同,各个对象的属性值则可以互不相同,并且随着程序的执行而变化。至于操作,则是所有对象共同使用它们的类定义中给出的操作代码。,消息(Message) 对象之间相互请求相互协作的途径一个消息由下述三部分组成: (1)接收消息的对象; (2)消息选择符(也称为消息名); (3)零个或多个变元。例如 : MyCircle.Show(GREEN) ;其中:MyCircle是接收消息的对象的名字Show是消息选择符(即消息名)GREEN是消息

15、的变元。,消息,2.3.3 封装将类封装起来,也是为了保护类的安全,所谓安全,就是限制使用类的属性和操作。按照面向对象的封装原则,一个对象的属性和操作是紧密结合的,对象的属性只能由这个对象的操作来存取。对象的操作分为内部操作和外部操作。内部操作只供对象内部的其他操作使用,不对外提供服务。外部操作对外提供一个消息接口,通过这个接口接收对象外部的消息并为之提供操作(服务)。对象内部数据结构的这种不可访问性称为信息(数据)隐藏。,数据封装给数据提供了与外界联系的标准接口,无论是谁,只有通过这些接口,使用规范的方式,才能访问这些数据。同时,由于程序员总是和接口打交道,因此就不必了解数据的具体细节。 简

16、言之,封装就是把对象的属性和操作结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。 在类中,封装是通过存取权限实现的,如将每个类的属性和操作分为私有的和公有的两种类型。对象的外部只能访问对象的公有部分,不能直接访问对象的私有部分。,2.3.4 继承对象的另一个特点是继承。继承是一个对象可以获得另一个对象的特性的机制,它支持层次类这一概念,例如红香蕉苹果属于苹果类,而苹果类又属于水果类。通过继承,低层的类只须定义特定于它的特征,而共享高层的类中的特征。,2.3.5 多态性不同的对象可以调用相同名称的函数,并可导致完全不同的行为的现象称为多态性。利用多态性,程序中只须进行一般形式的函数调用,函

17、数的实现细节留给接受函数调用的对象。这大大提高了我们解决复杂问题的能力。如将两个数“相加”,这两个数可以是整数或实数,将“+”看做一个特殊函数,则8+7和23.5+8.7都是使用“+”来完成两个数相加的功能,这就是“+”体现的多态性。由此可知,“-”、“*”和“/”也都具有这一特征,而且还可以自己定义这些运算符的功能。,2.5 熟悉并使用类和对象本节将介绍如何使用C+标准程序库提供的string类和complex类,目的是进一步了解类和对象的概念,为以后自己编写类打下基础。,2.5.1 使用string对象C+标准程序库提供string类,string类可以像char那样定义一个字符串对象,但

18、string类定义的对象不需要结束符“0”,而且可以使用string类提供的成员函数进行相应操作,例如求字符串的长度或取这个字符串的子串等。,图2.7 string类的简化图,从图2.7可见,它的属性是一个字符串str,同名函数string是构造函数,用来初始化字符串,有参数不同的几种构造函数。 另外3个成员函数用来对属性str进行操作。成员函数find用来在str字符串中检索所需要的子串;size成员函数计算并输出str存储的单词长度;substr成员函数,用来返回str字符串中的子串。 在程序中可以使用string类定义存储字符串的对象。这些对象隶属于string类,因此还必须在程序中包含

19、这个类的头文件,即使用语句#include 可以使用双引号括起来的单个字符常量初始化,即下面语句均是正确的:string str=A;string str(A); /也是正确的如果string 的对象str的内容为“ab”,则str0=a,str1=b。,【例2.6】演示使用string对象及初始化的例子。 #include #include using namespace std; void main() string str1(“We are here! “);string str2=“Where are you? “;coutstr1;cout“length of the “str1“

20、is “str1.size()“.“endl; ,下面是程序的输出结果:W!,We are here!W?,Where are you?please input a word: goodlength of the fine is 4.,对象使用自己的成员函数的方法是通过“.”运算符,格式如下:对象名.成员函数 例如对象str1使用类string的size成员函数计算并输出单词的长度,其格式为:str1.size() string类还提供将两个字符串连接起来组成一个新字符串的能力。“+”号将其后的字符串连接到前一个字符串的后面,也可以与单个字符常量相加。例如语句str=str + + str;

21、将原来的两个str 的内容用空格连起来,新内容为:We are here! We are here!,2.5.2 使用string类的典型成员函数实例string对象是通过调用成员函数实现操作,从而提供对象的行为或消息传递的。对象调用成员函数的语法可表示如下:对象名称.成员函数(参数(可供选择的消息内容)例如string类提供的substr成员函数,用来返回字符串的子串。第1个参数是要截取子串在字符串中的位置,第2个参数是截取的长度。要从对象str中截取“are”,因为C+规定字符串的计数是从零开始的,所以“a”处于位置3,可用如下语句实现:string newstr=str.substr(3

22、,3); 这时newstr的内容为“are”。,给出的位置必须位于字符串中,否则出错。如果长度大于字符串的长度,则是可以的,它自动截取到末尾。string strnew=newstr.substr(2,8); 截取的内容为“e”,等同于语句 “string strnew=newstr.substr(2,1);”。 成员函数find用来在主串中检索所需字符串。它有两个参数,格式如下:对象名称.find(要查找的字符串,开始查找的位置); 该成员函数返回查找到的字符串在主串的位置。例如:int i=str.find(are, 0 ); 表示从str字符串的位置0(起始位置)开始查找,结果为3。如果

23、改从4开始,则查找到连接的第2个“are”,结果为16。如果让它从17处开始,则找不到,返回值为-1。如果不给位置参数,默认位置参数为0,即上述语句可写为int i=str.find(are);,string类还提供一个辅助功能,以便使用getline从流cin中读出输入的一行给string类的对象。string InputLine;getline(cin, InputLine, n);cout your input: InputLineendl;如果输入“I am here!”,则得到如下结果:your input: I am here!,【例2.7】演示将美国格式的日期转换为国际格式的例子

24、。 美国使用月日年格式,例如May 28 , 2002。转为国际格式应为28 May 2002。这可以使用find检索,使用substr截取,然后再按要求重组。具体步骤如下: 寻找月份。假设string类的Date对象存放美国日期,则下列语句int i=Date.find(“ ”); /查找May与28之间的空格,i=3string Month=Date.substr(0,i) ; /从0位置开始截取i 个字符(上面求的i=3)得到Month。 寻找日子。寻找“,”号,假设其位置为k。Day的起始位置应是i+1处,长度应是k-(i+1),则语句string Day=Date.substr(i+

25、1, k-i-1); 得到Day。 寻找年份。年份应从逗号处再计数2次(因逗号后面有一个空格),长度为4,也可使用比年的长度长的字符串的总长度,这由它的成员函数size提供。下面两种方法是等效的:string Year = Date.substr(k + 2, Date.size() - 1);string Year = Date.substr(k + 2, 4); 按新格式拼装并输出。,下面是完整的程序及运行结果: #include #include using namespace std; void main() cout “Enter the date in American forma

26、t “ “(e.g., December 25, 2002) : “;string Date;getline(cin, Date, n);,int i = Date.find(“ “);string Month = Date.substr(0, i);int k = Date.find(“,“);string Day = Date.substr(i + 1, k - i - 1);string Year = Date.substr(k + 2, 4);string NewDate = Day + “ “ + Month + “ “ + Year;cout “Original date: “ D

27、ate endl;cout “Converted date: “ NewDate endl; 程序运行示范如下: Enter the date in American format (e.g., December 29, 1953) : May 28, 2002 Original date: May 28, 2002 Converted date: 28 May 2002,2.5.3 使用complex对象 C+标准程序库提供complex 类定义复数对象。在程序中包含这个类的头文件:#include 复数(complex number)类需要两个初始值:实部和虚部,这需要借助构造函数初始化来

28、实现多值处理。complex 类是一个模板类(template class),所谓模板,意思是说它可以定义多种数据类型的复数,例如实部和虚部的数据类型可以是整数,也可以是实数。这可以在complex后面使用“”加以说明。例如“”为整数,“”为实数,即:complex 对象名(实部值,虚部值);,使用模板定义复数对象时,指明数据成员的类型及其数值。例如:complex num1(2,3); /复数2+3icomplex num2(3.5, 4.5); /复数3.5+4.5icomplex的real和imag成员函数用来输出对象的实部和虚部的值。例如下面的语句输出浮点复数对象num2的实部和虚部:

29、coutnum2.real(),num2.imag()endl;,【例2.8】演示使用complex和string对象及初始化的例子。 #include #include #include using namespace std; void main() complex num1(2,3);complex num2(3.5, 4.5);string str1(“real is “);string str2=“image is “;coutstr1num1.real(),str2num1.imag()endl; coutstr1num2.real(),str2num2.imag()endl; 程

30、序的输出结果如下: real is 2,image is 3 real is 3.5,image is 4.5,2.5.4 使用对象小结通过前面的程序可以看出,标准库提供的类都是经过抽象,代表一类对象的。string类有一个字符串,用这个字符串来描述string类的属性,这个属性又称为数据成员。为了对这个字符串进行操作,还需要一系列的操作方法。用函数实现这些方法,又称这些函数为成员函数。数据成员(属性)和成员函数(方法)代表了字符串一类事物的特征。,#include / 包含它的头部文件string str1; / 定义这个类的一个对象str1str1=“This is a string“; / 给对象str1赋值coutstr1; / 使用对象str1string str2(“This is a str2”); / 定义这个类的另一个对象str2coutstr2.size(); / 使用对象str2的成员函数size/输出字符串长度可以先定义对象,然后给它赋值(str1);也可以在定义对象的同时初始化对象(str2),如果要使用对象的成员函数,则用“.”运算符,例如:coutstr1.size(); /使用对象str1的成员函数size/输出字符串str1的长度,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报