面向对象C++ 第二章_第1页
面向对象C++ 第二章_第2页
面向对象C++ 第二章_第3页
面向对象C++ 第二章_第4页
面向对象C++ 第二章_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第2章章 从结构到类的演变从结构到类的演变2.1 结构的演化结构的演化2.2 从结构演变一个简单的类从结构演变一个简单的类2.3 C+面向对象程序设计特点面向对象程序设计特点2.4 数据对象和数据类型数据对象和数据类型2.5 熟悉并使用类和对象熟悉并使用类和对象2.6 string对象数组与范型算法对象数组与范型算法2.7 结构化程序设计典型例题结构化程序设计典型例题2.8 活捉臭虫保平安活捉臭虫保平安2.1 结构的演化结构的演化 结构由若干元素构成,结构由若干元素构成,C语言中称这些结构元语言中称这些结构元素为素为结构成员结构成员,C+中称为中称为数据成员数据成员。能够做数据。能够做数据成

2、员的不只是基本数据类型的变量,还可以是构造成员的不只是基本数据类型的变量,还可以是构造类型(数组、指针甚至是其他类型的结构)变量。类型(数组、指针甚至是其他类型的结构)变量。 C+的结构中可以有函数。其实,类确实是从的结构中可以有函数。其实,类确实是从结构演变而来,开始称为结构演变而来,开始称为“带类的带类的C”。这场革命就。这场革命就是从让结构含有函数开始的。是从让结构含有函数开始的。2.1.1 结构发生质的演变结构发生质的演变1. 函数与数据共存函数与数据共存C+允许结构中可以定义函数,这些函数称为允许结构中可以定义函数,这些函数称为成员函数成员函数。如果将原来的结构成员称为数据成员的话,

3、可以使用如下如果将原来的结构成员称为数据成员的话,可以使用如下的形式描述:的形式描述: struct 结构名结构名 数据成员数据成员 成员函数成员函数 ; 可以像结构变量或指针使用结构成员那样,使用成员可以像结构变量或指针使用结构成员那样,使用成员函数:函数: 结构变量结构变量.成员函数成员函数 指向结构变量指针的名字指向结构变量指针的名字 - 成员函数成员函数假设为结构假设为结构Point设计一个设计一个Setxy函数如下:函数如下: void Setxy(double a, double b) x=a; y=b; 如果把域如果把域x和和y称为结构的称为结构的数据成员数据成员,则可,则可以使

4、用参数表中的以使用参数表中的a和和b赋给结构变量的数据成赋给结构变量的数据成员。假设有对象员。假设有对象(结构变量结构变量)a,则语句:,则语句: a.Setxy(12.5,14.5);使结构变量使结构变量a的的a.x=125, 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;

5、void Display() /成员函数,按指定格式输出成员函数,按指定格式输出 /数据成员的值数据成员的值 coutxtyDisplay(); /使用指向变量使用指向变量a的指针调用成员函数的指针调用成员函数 coutxtyendl;程序运行结果如下:程序运行结果如下:10.6 18.510.6 18.510.6 18.5 主程序中的变量是通过结构的成员函数使用数据成员,但最主程序中的变量是通过结构的成员函数使用数据成员,但最后一条语句则是直接使用数据成员。这称作结构后一条语句则是直接使用数据成员。这称作结构 Point的的公有公有(public)性质。性质。2. 封装性封装性所谓封装性,就

6、是限制存取权限。如果在定义结所谓封装性,就是限制存取权限。如果在定义结构时,将数据成员使用构时,将数据成员使用private关键字定义,则产关键字定义,则产生封装性生封装性。 【例【例2.2】使结构具有封装性的实例。】使结构具有封装性的实例。#include using namespace std;struct Point private: double x, y; /数据成员数据成员 public: void Setxy(double a, double b) /成员函数成员函数 /用来重新设置数据成员用来重新设置数据成员 x=a; y=b; void Display() /成员函数,按指定

7、格式成员函数,按指定格式 /输出数据成员的值输出数据成员的值 coutxtyendl; 没有使用没有使用private定义的成员函数,默认为定义的成员函数,默认为public(也也可以直接使用可以直接使用public)。这时,如果还使用。这时,如果还使用【例【例2.1】的主】的主程序,则其最后一条语句就出现编译错误。也就是说,程序,则其最后一条语句就出现编译错误。也就是说,私私有的数据成员,必须通过有的数据成员,必须通过成员函数成员函数才能使用,这就称为数才能使用,这就称为数据的封装性。据的封装性。2.1.2 使用构造函数初始化结构的对象使用构造函数初始化结构的对象 因为因为【例【例2.2】的

8、程序使结构具有封装性,所】的程序使结构具有封装性,所以不能使用初始化列表初始化结构对象。为此,这以不能使用初始化列表初始化结构对象。为此,这里为结构里为结构Point设计两个专门用于初始化的函数。设计两个专门用于初始化的函数。这两个函数具有相同的名字这两个函数具有相同的名字Point,其原型如下:,其原型如下: Point(); Point(double,double); 这是函数重载。因为这里的函数名与结构同名,这是函数重载。因为这里的函数名与结构同名,称为称为构造函数构造函数。构造函数专门用于初始化对象。构造函数专门用于初始化对象。【例【例2.3】使用构造函数初始化对象的实例。】使用构造函

9、数初始化对象的实例。#include using namespace std;struct Point private: 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() /成员函数,按指定格式输出成员函数,按指定格式输出 数据成员的值数据成

10、员的值 coutxtyendl;void main( ) Point a; /定义对象定义对象a Point b(18.5 , 10.6); /定义对象定义对象b并赋初值并赋初值 a.Setxy(10.6,18.5); /设置变量设置变量a的数据成员的数据成员 a.Display(); /显示变量显示变量a的数据成员的数据成员 b.Display(); /显示变量显示变量b的数据成员的数据成员程序运行结果如下:程序运行结果如下:10.6 18.518.5 10.6 现在不深究构造函数的原理,只要记住它的现在不深究构造函数的原理,只要记住它的使用方法即可。一般形式为:使用方法即可。一般形式为:

11、构造函数名构造函数名 对象名(初始化参数);对象名(初始化参数);程序在运行时,会自动完成初始化任务。例如语程序在运行时,会自动完成初始化任务。例如语句句 Point b(18.5 , 10.6); 使得使得a.x=18.5,a.y=10.6。2.2 从结构演变一个简单的类从结构演变一个简单的类其实,使用关键字其实,使用关键字class代替代替struct,就是一个,就是一个标准的类。标准的类。【例【例2.4】定义类的实例。】定义类的实例。class Point private: double x, y; /类类point的数据成员的数据成员public: Point(); /类类Point的

12、无参数构造函数的无参数构造函数 Point(double a, double b) /具有两个参数的构造函数具有两个参数的构造函数 x=a; y=b; void Setxy(double a, double b) /成员函数,用来成员函数,用来 /重新设置数据成员重新设置数据成员 num=a; score=b; void Display() /成员函数,按指定格成员函数,按指定格 /式输出数据成员的值式输出数据成员的值 coutxtyendl; ;使用类产生对象的方式如结构一样,可以使用如下的主函使用类产生对象的方式如结构一样,可以使用如下的主函数,将得到相同的运行结果。数,将得到相同的运行结

13、果。void main( ) Point a; /定义类定义类Point的对象的对象a Point b(18.5 , 10.6); /定义类定义类Point的对象的对象b并初始化并初始化 a.Setxy(10.6,18.5); /为对象为对象a的数据成员赋值的数据成员赋值 a.Display(); /显示对象显示对象a的数据成员的数据成员 b.Display(); /显示对象显示对象b的数据成员的数据成员程序运行结果如下:程序运行结果如下:10.6 18.518.5 10.6可以将可以将point类看作直角坐标系的点类类看作直角坐标系的点类2.3 C+面向对象程序设计特点面向对象程序设计特点面

14、向对象的程序设计方法要求语言必须具备抽象、面向对象的程序设计方法要求语言必须具备抽象、封装、继承和多态性等关键要素。封装、继承和多态性等关键要素。2.3.1 对象对象 现实世界中客观存在的事物为对象。复杂的对现实世界中客观存在的事物为对象。复杂的对象可以由简单的对象组成,例如火车站对象又包象可以由简单的对象组成,例如火车站对象又包含售票处、行李房、信号灯、站台、铁轨和通信含售票处、行李房、信号灯、站台、铁轨和通信设施等对象。这些对象各自又由许多对象组成,设施等对象。这些对象各自又由许多对象组成,对象各自完成特定的功能。总之,对象各自完成特定的功能。总之,世界万物皆对世界万物皆对象象。 售票处有

15、各种规格的车票,这些车票表示售票售票处有各种规格的车票,这些车票表示售票处的处的静态特征静态特征。它提供发售车票的功能。它提供发售车票的功能(操作操作),表,表示了售票处的示了售票处的动态特征动态特征。 通过这种抽象归纳,通过这种抽象归纳,C+可使用对象名、属可使用对象名、属性和操作三要素来描述对象。性和操作三要素来描述对象。l对象名用来标识一个具体对象。用数据来表示对对象名用来标识一个具体对象。用数据来表示对象的属性,一个属性就是描述对象静态特征的一象的属性,一个属性就是描述对象静态特征的一个数据项。个数据项。l操作是描述对象动态特征(行为)的一个函数序操作是描述对象动态特征(行为)的一个函

16、数序列(使用函数实现),也称为方法或服务。列(使用函数实现),也称为方法或服务。l数据称为数据成员,函数称为成员函数。数据称为数据成员,函数称为成员函数。 由此可见,由此可见,C+中的对象是系统中用来描述中的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单客观事物的一个实体,是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作位。一个对象由一组属性和对这组属性进行操作的成员函数构成。的成员函数构成。对象名对象名属性属性1 1属性属性2 2属性属性n n操作操作1 1操作操作2 2操作操作n n图图2.22.2对象结构图对象结构图 【例【例2.5】用简单对象表示平面上的

17、】用简单对象表示平面上的A(3.5,6.4)和和B(8.5,8.9)两个坐标点。可使用图两个坐标点。可使用图2.3表示具体对表示具体对象象A和和B的对象结构。的对象结构。 Bx(8.5)y(8.9) display( );setxy( );move( );Ax(3.5)y(6.4) display( );setxy( );move( ); 对象名是对象名是“A”,A是一个点的对象。没有给对象是一个点的对象。没有给对象A的属性赋值时,这只是个抽象名的属性赋值时,这只是个抽象名词。只有具有确定的属性值,才是一个具有确定位置的点。图中用词。只有具有确定的属性值,才是一个具有确定位置的点。图中用x坐标

18、和坐标和y坐标表示坐标表示坐标点对象的静态属性(称为位置属性)。坐标点对象的静态属性(称为位置属性)。 假设让点对象对外有显示属性值、设置属性值和移动位置等操作,这里分别使用假设让点对象对外有显示属性值、设置属性值和移动位置等操作,这里分别使用成员函数成员函数display, setxy, move来实现这些操作。来实现这些操作。 2.3.2 抽象和类抽象和类 抽象是一种从一般的观点看待事物的方法,即集抽象是一种从一般的观点看待事物的方法,即集中于事物的本质特征,而不是具体细节或具体实现。中于事物的本质特征,而不是具体细节或具体实现。 面向对象鼓励程序员以抽象的观点看待程序,即面向对象鼓励程序

19、员以抽象的观点看待程序,即程序是由一组抽象的对象程序是由一组抽象的对象(类类)组成的。组成的。 可以将一组对象的共同特征进一步抽象出来,从可以将一组对象的共同特征进一步抽象出来,从而形成而形成“类类”的概念。例如,从点的概念。例如,从点A和和B抽象出点的抽象出点的概念,这就是概念,这就是“点类点类”。Point float x; float y; display( );setxy( );move( );图图2.4 类类Point的结构图的结构图 类由类名、一组属性和一组操类由类名、一组属性和一组操作等作等3部分组成。类的属性只是性部分组成。类的属性只是性质的说明,对象的属性才是具体的质的说明,

20、对象的属性才是具体的数据。所以,图数据。所以,图2.4的的Point类只是类只是表示类名是表示类名是Point,它的点位置是,它的点位置是两个实数,但还没有具体的位置。两个实数,但还没有具体的位置。只有像本节只有像本节A和和B两点具有确定的两点具有确定的属性值,才是属性值,才是Point类的具体对象,类的具体对象,称它为类称它为类Point的一个的一个实例实例。类名类名属性属性1属性属性2 2属性属性n n操作操作1 1操作操作2 2操作操作n n图图2.5 类模型的结构图类模型的结构图 对于一个具体的类,它有许多具体的个体,对于一个具体的类,它有许多具体的个体,这些个体叫做这些个体叫做“对象

21、对象”。举个例子,。举个例子,“人人”是一是一个类,具有个类,具有“直立行走、会使用工具直立行走、会使用工具”等一些区等一些区别于其他事物的共同特征;而张三、李四、王五别于其他事物的共同特征;而张三、李四、王五等一个个具体的人,就是等一个个具体的人,就是“人人”这个类的一个个这个类的一个个“对象对象”,同一类的不同对象具有相同的行为方,同一类的不同对象具有相同的行为方式(如张三和李四都能直立行走、会使用工具),式(如张三和李四都能直立行走、会使用工具),不同类的对象具有不同的行为。不同类的对象具有不同的行为。 类的作用是定义对象。类和对象的关系如同类的作用是定义对象。类和对象的关系如同一个模具

22、与用这个模具铸造出来的铸造件之间的一个模具与用这个模具铸造出来的铸造件之间的关系。类给出了属于该类的全部对象的抽象定义,关系。类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的实体。所以,而对象则是符合这种定义的实体。所以,C+中中将将对象称做对象称做类的一个类的一个实例实例。 在程序中,每个对象在程序中,每个对象需要有自己的存储空间需要有自己的存储空间以以保存它们自己的属性值。所谓保存它们自己的属性值。所谓“一个类的所有对一个类的所有对象具有相同的属性象具有相同的属性”,是指属性的个数、名称、,是指属性的个数、名称、数据类型相同,各个对象的属性值则可以互不相数据类型相同,各个对象

23、的属性值则可以互不相同,并且随着程序的执行而变化。至于操作,则同,并且随着程序的执行而变化。至于操作,则是是所有对象共同使用它们的类定义中给出的操作所有对象共同使用它们的类定义中给出的操作代码代码。l消息(消息(MessageMessage)对象之间相互请求相互协作的途径对象之间相互请求相互协作的途径 一个消息由下述三部分组成:一个消息由下述三部分组成:(1 1)接收消息的对象;)接收消息的对象;(2 2)消息选择符(也称为消息名);)消息选择符(也称为消息名);(3 3)零个或多个变元。)零个或多个变元。 例如例如 : MyCircle.Show(GREENMyCircle.Show(GRE

24、EN) ) ; 其中:其中: MyCircleMyCircle是接收消息的对象的名字是接收消息的对象的名字 ShowShow是消息选择符(即消息名)是消息选择符(即消息名) GREENGREEN是消息的变元。是消息的变元。 消息消息2.3.3 封装封装 将类封装起来,也是为了保护类的安全,所将类封装起来,也是为了保护类的安全,所谓安全,就是限制使用类的属性和操作。谓安全,就是限制使用类的属性和操作。 按照面向对象的封装原则,一个对象的属性按照面向对象的封装原则,一个对象的属性和操作是紧密结合的,对象的属性只能由这个对和操作是紧密结合的,对象的属性只能由这个对象的操作来存取。象的操作来存取。 对

25、象的操作分为对象的操作分为内部内部操作和操作和外部外部操作。内部操作。内部操作只供对象内部的其他操作使用操作只供对象内部的其他操作使用,不对外提供,不对外提供服务。外部操作对外提供一个消息接口,通过这服务。外部操作对外提供一个消息接口,通过这个接口接收对象外部的消息并为之提供操作(服个接口接收对象外部的消息并为之提供操作(服务)。对象内部数据结构的这种不可访问性称为务)。对象内部数据结构的这种不可访问性称为信息信息(数据数据)隐藏隐藏。l数据封装给数据提供了与外界联系的标准接数据封装给数据提供了与外界联系的标准接口,无论是谁,只有通过这些接口,使用规口,无论是谁,只有通过这些接口,使用规范的方

26、式,才能访问这些数据。同时,由于范的方式,才能访问这些数据。同时,由于程序员总是和接口打交道,因此就不必了解程序员总是和接口打交道,因此就不必了解数据的具体细节。数据的具体细节。l简言之,封装就是把对象的属性和操作结合简言之,封装就是把对象的属性和操作结合成一个独立的系统单位,并尽可能隐蔽对象成一个独立的系统单位,并尽可能隐蔽对象的内部细节。的内部细节。 l在类中,封装是通过在类中,封装是通过存取权限存取权限实现的,如将实现的,如将每个类的属性和操作分为每个类的属性和操作分为私有私有的和的和公有公有的两的两种类型。对象的外部只能访问对象的公有部种类型。对象的外部只能访问对象的公有部分,不能直接

27、访问对象的私有部分。分,不能直接访问对象的私有部分。2.3.4 继承继承 对象的另一个特点是继承。继承是一个对对象的另一个特点是继承。继承是一个对象可以获得另一个对象的特性的机制,它支持象可以获得另一个对象的特性的机制,它支持层次类这一概念,例如红香蕉苹果属于苹果类,层次类这一概念,例如红香蕉苹果属于苹果类,而苹果类又属于水果类。通过继承,低层的类而苹果类又属于水果类。通过继承,低层的类只须定义特定于它的特征,而共享高层的类中只须定义特定于它的特征,而共享高层的类中的特征。的特征。2.3.5 多态性多态性 不同的对象可以调用相同名称的函数,并可不同的对象可以调用相同名称的函数,并可导致完全不同

28、的行为的现象称为多态性。利用多导致完全不同的行为的现象称为多态性。利用多态性,程序中只须进行一般形式的函数调用,函态性,程序中只须进行一般形式的函数调用,函数的实现细节留给接受函数调用的对象。这大大数的实现细节留给接受函数调用的对象。这大大提高了我们解决复杂问题的能力。提高了我们解决复杂问题的能力。 如将两个数如将两个数“相加相加”,这两个数可以是整数,这两个数可以是整数或实数,将或实数,将“+”看做一个特殊函数,则看做一个特殊函数,则8+7和和23.5+8.7都是使用都是使用“+”来完成两个数相加的功能,来完成两个数相加的功能,这就是这就是“+”体现的多态性。由此可知,体现的多态性。由此可知

29、,“-”、“*”和和“/”也都具有这一特征,而且还可以自己也都具有这一特征,而且还可以自己定义这些运算符的功能。定义这些运算符的功能。2.5 熟悉并使用类和对象熟悉并使用类和对象 本节将介绍如何使用本节将介绍如何使用C+标准程序库提供的标准程序库提供的string类和类和complex类,目的是进一步了解类和类,目的是进一步了解类和对象的概念,为以后自己编写类打下基础。对象的概念,为以后自己编写类打下基础。 2.5.1 使用使用string对象对象 C+标准程序库提供标准程序库提供string类,类,string类可以像类可以像char那样定义一个字符串对象,但那样定义一个字符串对象,但str

30、ing类定义的类定义的对象不需要结束符对象不需要结束符“0”,而且可以使用,而且可以使用string类类提供的成员函数进行相应操作,例如求字符串的提供的成员函数进行相应操作,例如求字符串的长度或取这个字符串的子串等。长度或取这个字符串的子串等。 图图2.7 string类的简化图类的简化图string str string find size substrl从图从图2.7可见,它的可见,它的属性属性是一个字符串是一个字符串str,同名函数,同名函数string是构是构造函数,用来初始化字符串,有参数不同的几种构造函数。造函数,用来初始化字符串,有参数不同的几种构造函数。l另外另外3个成员函数用

31、来对属性个成员函数用来对属性str进行操作。成员函数进行操作。成员函数find用来在用来在str字符串中检索所需要的子串;字符串中检索所需要的子串;size成员函数计算并输出成员函数计算并输出str存储存储的单词长度;的单词长度;substr成员函数,用来返回成员函数,用来返回str字符串中的子串。字符串中的子串。l在程序中可以使用在程序中可以使用string类定义存储字符串的对象。这些对象隶类定义存储字符串的对象。这些对象隶属于属于string类,因此还必须在程序中包含这个类的头文件,即使类,因此还必须在程序中包含这个类的头文件,即使用语句用语句 #include l可以使用双引号括起来的单

32、个字符常量初始化,即下面语句均可以使用双引号括起来的单个字符常量初始化,即下面语句均是正确的:是正确的: 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? ; couts

33、tr10str111,str1endl; coutstr20str213,str2endl; coutstr1; coutlength of the str1 is str1.size().endl;下面是程序的输出结果:下面是程序的输出结果: W!,We are here! W?,Where are you? please input a word: good length of the fine is 4.对象使用自己的成员函数的方法是通过对象使用自己的成员函数的方法是通过“.”运算运算符,格式如下:符,格式如下: 对象名对象名.成员函数成员函数例如对象例如对象str1使用类使用类stri

34、ng的的size成员函数计算并成员函数计算并输出单词的长度,其格式为:输出单词的长度,其格式为: str1.size()string类还提供将两个字符串连接起来组成一个类还提供将两个字符串连接起来组成一个新字符串的能力。新字符串的能力。“+”号将其后的字符串连接到号将其后的字符串连接到前一个字符串的后面,也可以与单个字符常量相前一个字符串的后面,也可以与单个字符常量相加。例如语句加。例如语句 str=str + + str;将原来的两个将原来的两个str 的内容用空格连起来,新内容为:的内容用空格连起来,新内容为: We are here! We are here!2.5.2 使用使用stri

35、ng类的典型成员函数实例类的典型成员函数实例 string对象是通过调用成员函数实现操作,从而对象是通过调用成员函数实现操作,从而提供对象的行为或消息传递的。对象调用成员函数的提供对象的行为或消息传递的。对象调用成员函数的语法可表示如下:语法可表示如下: 对象名称对象名称.成员函数(参数(可供选择的消息内成员函数(参数(可供选择的消息内容)容) 例如例如string类提供的类提供的substr成员函数,用来返回成员函数,用来返回字符串的子串。字符串的子串。第第1个参数是要截取子串在字符串中个参数是要截取子串在字符串中的位置,第的位置,第2个参数是截取的长度个参数是截取的长度。要从对象。要从对象

36、str中截中截取取“are”,因为,因为C+规定字符串的计数是从零开始的,规定字符串的计数是从零开始的,所以所以“a”处于位置处于位置3,可用如下语句实现:,可用如下语句实现: string newstr=str.substr(3,3);这时这时newstr的内容为的内容为“are”。l给出的位置必须位于字符串中,否则出错。如果长度大于给出的位置必须位于字符串中,否则出错。如果长度大于字符串的长度,则是可以的,它自动截取到末尾。字符串的长度,则是可以的,它自动截取到末尾。 string strnew=newstr.substr(2,8);截取的内容为截取的内容为“e”,等同于语句,等同于语句“

37、string strnew=newstr.substr(2,1);”。l成员函数成员函数find用来在主串中检索所需字符串。它有两个参用来在主串中检索所需字符串。它有两个参数,格式如下:数,格式如下: 对象名称对象名称.find(要查找的字符串,开始查找的位置要查找的字符串,开始查找的位置);该成员函数返回查找到的字符串在主串的位置。例如:该成员函数返回查找到的字符串在主串的位置。例如: int i=str.find(are, 0 );表示从表示从str字符串的位置字符串的位置0(起始位置起始位置)开始查找,结果为开始查找,结果为3。如果改从如果改从4开始,则查找到连接的第开始,则查找到连接的

38、第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; 如果

39、输入如果输入“I am here!”,则得到如下结果:,则得到如下结果: your input: I am here!【例【例2.7】演示将美国格式的日期转换为国际格式的例子。】演示将美国格式的日期转换为国际格式的例子。美国使用月日年格式,例如美国使用月日年格式,例如May 28 , 2002。转为国际格式应为。转为国际格式应为28 May 2002。这可以使用。这可以使用find检索,使用检索,使用substr截取,然后再截取,然后再按要求重组。具体步骤如下:按要求重组。具体步骤如下: 寻找月份。寻找月份。假设假设string类的类的Date对象存放美国日期,则下列对象存放美国日期,则下列语

40、句语句 int i=Date.find(“ ”); /查找查找May与与28之间的空格,之间的空格,i=3 string Month=Date.substr(0,i) ; /从从0位置开始截取位置开始截取i 个字符个字符(上面求的上面求的i=3)得到得到Month。 寻找日子。寻找日子。寻找寻找“,”号,假设其位置为号,假设其位置为k。Day的起始位置的起始位置应是应是i+1处,长度应处,长度应是是k-(i+1),则语句,则语句 string Day=Date.substr(i+1, k-i-1); 得到得到Day。 寻找年份。寻找年份。年份应从逗号处再计数年份应从逗号处再计数2次(因逗号后面

41、有一个空次(因逗号后面有一个空格),长度为格),长度为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

42、() cout Enter the date in American format (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 +

43、+ Year; cout Original date: Date endl; cout Converted date: NewDate endl; 程序运行示范如下:程序运行示范如下:Enter the date in American format (e.g., December 29, 1953) : May 28, 2002Original date: May 28, 2002Converted date: 28 May 20022.5.3 使用使用complex对象对象C+标准程序库提供标准程序库提供complex 类定义复数对象。在程类定义复数对象。在程序中包含这个类的头文件:序中包含这个类的头文件: #include 复数(复数(complex number)类需要两个初始值:实部)类需要两个初始值:实部和虚部,这需要借助构造函数初始化来实现多值处理。和虚部,这需要借助构造函数初始化来实现多值处理。 complex 类是一个类是一个模板类模板类(template class),所谓,所谓模板,意思是说它可以定义多种数据类型的复数,例模板,意思是说它可以定义多种数据类型的复数,例如实部和虚部的数据类型可以是整数,也可以是实数。如实部和虚部的数据类型可以是整数,也可以是实数。 这可以在这可以在comple

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论