《C++程序设计-郑莉第四版(第6章).ppt》由会员分享,可在线阅读,更多相关《C++程序设计-郑莉第四版(第6章).ppt(98页珍藏版)》请在三一办公上搜索。
1、1,第六章 数组 指针与字符串,C+语言程序设计,2,本章主要内容,数组指针指针与数组指针与函数动态存储分配字符串,3,数组的概念,数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。因此当需要多个同类型变量时就要考虑定义数组。,数 组,4,数组的说明与使用,数组的声明 一般形式:类型说明符 标识符 常量表达式1;例如:int a10;表示 a 为整型数组,有10个元素:a0.a9,数 组,引用必须先声明,后使用。只能逐个引用数组元素,而不能一次引用整个数组例如:a0=a5+a7-a2*3,5,数组的说明与使用,数 组,数组的使用 使用数组时,只能分别对数组的各个
2、元素进行操作。数组的元素是由下标来区分的,对于一个已经声明过的数组,其元素的使用形式为:数组名 下标表达式1 下标表达式2,使用数组注意:(1)数组元素的下标表达式可以是任意合法的算术表达式,其结果必须为整型数。(2)数组元素的下标值不得超过声明时所规定的上下界,否则运行时数组越界错误。,6,例:给出下面程序的输出结果。#include int count5=1,2;void main()int i;char c=hello!;for(i=0;i=4;i+)coutcountiendl;coutcendl;coutsizeof(c)endl;coutcountendl;coutsizeof(c
3、ount)endl;coutsizeof(count)/sizeof(int)endl;,运行结果为:1/count02/count10/count20/count30/count5hello!/输出字符串c7/字符串c长度为70 x00408040/数组count首地址20/数组count占总字节数5/数组count元素个数,7,一维数组的存储顺序,数组元素在内存中顺次存放,它们的地址是连续的。例如:具有10个元素的数组 a,在内存中的存放次序如下:,数组名字是数组首元素的内存地址。数组名是一个常量,不能被赋值。,数 组,8,一维数组的初始化,可以在编译阶段使数组得到初值:在声明数组时对数组
4、元素赋以初值。可以只给一部分元素赋初值。在对全部数组元素赋初值时,可以不指定数组长度。,数 组,例如:static int a10=0,1,2,3,4,5,6,7,8,9;,例如:static int a10=0,1,2,3,4;,例如:static int a=1,2,3,4,5,9,二维数组的声明及引用,数据类型 标识符常量表达式1常量表达式2;例:int a53;表示a为整型二维数组,其中第一维有5个下标(04),第二维有3个下标(02),数组的元素个数为15,可以用于存放5行3列的整型数据表格。,数 组,存储顺序按行存放,上例中数组a的存储顺序为:,二维数组的声明类型说明符 数组名常量
5、表达式常量表达式例如:float a34;,引用例如:b12=a23/2,下标不要越界,二维数组的声明及引用,数 组,分行给二维数组赋初值例如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;将所有数据写在一个 内,按顺序赋值例如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;可以对部分元素赋初值例如:static int a34=1,0,6,0,0,11;,二维数组的初始化,数 组,12,数组作为函数参数,数组元素作实参,与单个变量一样。数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的
6、改变会直接影响到实参数组。,数 组,13,例6-2 使用数组名作为函数参数,例:主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。,数 组,#include void RowSum(int A4,int nrow)int sum;for(int i=0;i nrow;i+)sum=0;for(int j=0;j 4;j+)sum+=Aij;cout Sum of row i is sum endl;,void main(void)int Table34=1,2,3,4,2,3,4,5,3,4,5
7、,6;for(int i=0;i 3;i+)for(int j=0;j 4;j+)cout Tableij;cout endl;RowSum(Table,3);,运行结果:1 2 3 42 3 4 53 4 5 6Sum of row 0 is 10Sum of row 1 is 14Sum of row 2 is 18,17,对象数组,声明:类名 数组名元素个数;访问方法:通过下标访问 数组名下标.成员名,数 组,18,对象数组初始化,数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。例:Point A2=Point(1,2),Point(3,4);如果没
8、有为数组元素指定显式初始值,数组元素便使用缺省值初始化(调用缺省构造函数)。,数 组,19,数组元素所属类的构造函数,不声明构造函数,则采用缺省构造函数。各元素对象的初值要求为相同的值时,可以声明具有缺省形参值的构造函数。各元素对象的初值要求为不同的值时,需要声明带形参(无缺省值)的构造函数。当数组中每一个对象被删除时,系统都要调用一次析构函数。,数 组,20,例6-3 对象数组应用举例,/Point.h#ifndef _POINT_H#define _POINT_Hclass Point public:Point();Point(int xx,int yy);Point();void Mov
9、e(int newX,int newY);int GetX()return x;int GetY()return y;static void showCount();private:int x,y;#endif,数 组,/Point.cpp#include#include“Point.h“using namespace std;Point:Point()x=y=0;coutDefault Constructor called.endl;Point:Point(int x,int y):x(x),y(y)cout Constructor called.endl;,Point:Point()cou
10、tDestructor called.endl;void Point:Move(int newX,int newY)cout“Moving the point to(“newX“,”newYendl;x=newX;y=newY;,/6_3.cpp#include“Point.h”#includeusing namespace std;int main()coutEntering main.endl;Point a2;for(int i=0;i2;i+)ai.Move(i+10,i+20);coutExiting main.endl;return 0;,运行结果:Entering main.De
11、fault Constructor called.Default Constructor called.Moving the point to(10,20)Moving the point to(11,21)Exiting main.Destructor called.Destructor called.,25,关于内存地址,内存空间的访问方式通过变量名访问通过地址访问地址运算符:则&var 表示变量var在内存中的起始地址,指 针,26,声明例:static int i;static int*i_pointer=指向整型变量的指针,指针变量的概念,概念指针:另一个变量的地址,用于间接访问变量
12、指针变量:用于存放地址的变量,引用例1:i=3;例2:*i_pointer=3;,指 针,27,与地址相关的运算“*”和“&”,*:指针运算符,表示指针所指向的变量的值,指 针,28,与地址相关的运算“*”和“&”,如果已经执行了int a,b;int*point_1,*point_2;point_1=(1)&*point_1的含义?(2)*&a的含义?,指 针,(2)*&a与*point_1的作用是一样的,它们等价于变量a。即*&a与a等价,29,指针变量的初始化,语法形式 存储类型 数据类型*指针名初始地址;例:int*pa=,指 针,注:存储类型是指数据在内存中存储的方式。分为两类:静态
13、存储类和动态存储类。具体包含四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。自动的”auto”可以省略。,注意事项:(1)用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。(2)可以用一个已赋初值的指针去初始化另一 个指针变量。,30,指针变量的赋值运算,指针名=地址“地址”中存放的数据类型与指针类型必须相符。向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsigned lo
14、ng int型。允许声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。例:void*general;,指 针,31,例6-5 指针的声明、赋值与使用,#includeusing namespace std;void main()int i;int*ptr=,指 针,/取i的地址赋给ptr,/输出int型数的值,/输出int型指针所指地址的内容,程序运行的结果是:i=10*ptr=10,33,几种特殊的指针类型,指 针,(1)可以声明指向常量的指针,此时不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。例:P164例:int n1=3;int const
15、n2=5;const int*pn=,/正确,/错误,34,指 针,(2)可以声明指针类型的常量,这时指针本身的值不能被改变。例:P164例:int n1=3;int const n2=5;int*const pn=/正确,35,例6-6 void类型指针的使用void main()/void vodObject;/错,不能声明void类型的变量void*pv;/对,可以声明void类型的指针int i=5;pv=,指 针,/void类型指针指向整型变量,/void指针赋值给int指针需要类型强制转换:,(3)一般情况下,指针的值只能赋给相同类型的指针。但是有一种特殊的void类型指针,可以存
16、储任何类型的对象地址,36,指针运算,指针与整数的加减运算指针 p 加上或减去 n,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。这种运算的结果值取决于指针指向的数据类型。,指 针,37,指针变量的算术运算,指针加一,减一运算指向下一个或前一个数据。例如:y=*px+/*相当于 y=*(px+)*/*相当于y=*px;px+*/,指 针,(后置+运算符优先级高于*),详细分析:*px+相当于*(px+),但(px+)的值为px,因而*与px结合成*px,继续运算将*px的值赋值给y,表达式运算结束后,再为px值增1。,pa,pb-1,pb,pb+1,pb+2,*(pb-1),*pb
17、,*(pb+1),*(pb+2),long*pb,40,关系运算指向相同类型数据的指针之间可以进行各种关系运算。指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。指针可以和零之间进行等于或不等于的关系运算。例如:p=0或p!=0赋值运算向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。,指针变量的关系运算,指 针,41,用指针处理数组元素,声明与赋值例:int a6=10,20,30,40,50,60,*pa;pa=当指针变量指向该数组后可以通过指针引用数组元素,指 针,42,由此可见如下的等价关系成立:,paa&a0/表示数组元素的首
18、地址pa+i a+i&ai/表示第i+1个数组元素的地址*(pa+i)*(a+i)ai/表示第i+1数组元素,指 针,访问数组元素的三种方式:(1)下标方式 形式:数组名下标(2)地址方式 形式:*(地址)(3)指针方式 形式:*指针变量,注意:(1)pa与a的区别:两者同样是表示数组a的地址,但本质不同,pa是变量,而a是常量.所以对pa进行pa+,pa等赋值运算,改变pa的值;但不能对a进行a+,a-等赋值运算.,43,注意:(2)*pa+与(*pa)+区别*pa+的+运算符作用于指针变量,即取指针所指对象的值后,再对指针进行+运算,改变的是指针变量的值;而(*pa)+的+运算符作用于指针
19、变量所指对象,即取指针所指对象的值,加1后再赋值给对象,指 针,44,例6-7,设有一个int型数组a,有10个元素。用三种方法输出各元素:使用数组名和下标使用数组名和指针运算使用指针变量,指 针,main()int a10;int i;for(i=0;iai;coutendl;for(i=0;i10;i+)coutai;,使用数组名和下标,main()int a10;int i;for(i=0;iai;coutendl;for(i=0;i10;i+)cout*(a+i);,使用数组名指针运算,使用指针变量,main()int a10;int*p,i;for(i=0;iai;coutendl;
20、for(p=a;p(a+10);p+)cout*p;,48,指针数组,数组的每个元素是指针变量,这个数组就是指针数组,指针数组的每个元素都是同一类型的指针声明一维指针数组的语法形式:类型名*数组名下标表达式 例:int*p_i3;,指 针,声明了一个int 型指针数组p_i,数组有3个元素,每个元素都是一个指向int型数据的指针.,49,例6-8 利用指针数组输出单位矩阵,#include void main()int line1=1,0,0;/声明数组,矩阵的第一行int line2=0,1,0;/声明数组,矩阵的第二行int line3=0,0,1;/声明数组,矩阵的第三行int*p_li
21、ne3;/声明整型指针数组p_line0=line1;/初始化指针数组元素p_line1=line2;p_line2=line3;,指 针,/输出单位矩阵 coutMatrix test:endl;for(int i=0;i3;i+)/对指针数组元素循环 for(int j=0;j3;j+)/对矩阵每一行循环 coutp_lineij;coutendl;,输出结果为:Matrix test:1,0,00,1,00,0,1,51,例6-9 二维数组举例,#include void main()int array223=11,12,13,21,22,23;for(int i=0;i2;i+)cou
22、t*(array2+i)endl;for(int j=0;j3;j+)cout*(*(array2+i)+j);coutendl;,指 针,52,用指针作为函数参数,如果以指针作为形参,在调用时实参将值传递给形参,使得指针变量指向同一内存地址。这样在子函数运行过程中,对形参指针所指变量值的改变也同时影响实参指针所指向的变量的值。指针作为函数的形参有三个作用:P209(了解),指针与函数,53,指针做函数参数举例,例6.10:读入三个浮点数,将整数部分和小数部分分别输出#include using namespace std;void splitfloat(float x,int*intpart
23、,float*fracpart)/形参intpart、fracpart是指针*intpart=static_cast(x);/取x的整数部分*fracpart=x-*intpart;/取x的小数部分 void main(void)int i,n;float x,f;cout x;splitfloat(x,指针与函数,54,运行结果:Enter three(3)floating point numbers 4.7Integer Part is 4 Fraction Part is 0.78.913Integer Part is 8 Fraction Part is 0.913-4.7518Int
24、eger Part is-4 Fraction Part is-0.7518,55,指针型函数,除了void类型的函数之外,函数在调用结束后都会有返回值,指针同样可以作为函数的返回值。当一个函数的返回值是指针类型时,这个函数就是指针型函数。通常非指针型函数调用结束后,可以返回一个变量或对象,但这样每次调用只能返回一个数据,而指针型函数在函数结束时把大量的数据从被调函数返回到主调函数中。,指针与函数,指针型函数的一般定义形式:数据类型*函数名(参数表)函数体,56,例:#includeint*fun();void main()int*p;p=fun();while(*p!=-1)cout*p+e
25、ndl;int*fun()int*h=new int4;h0=1;h1=2;h2=3;h3=-1;return h;,57,含义:数据指针指向数据存储区,而函数指针指向的是程序代码存储区。实际上函数名就表示函数的代码在内存中的起始地址。,指向函数的指针,指针与函数,注意:函数指针在使用之前也要进行赋值,使指针指向一个已经存在的函数代码的起始地址。一般语法为:函数指针名=函数名;,P212 例6-11,58,#include using namepsace std;void printStuff(float data_to_ignore)coutThis is the print stuff f
26、unction.“endl;void printMessage(float list_this_data)coutThe data to be listed is“list_this_dataendl;void printFloat(float data_to_print)coutThe data to be printed is“data_to_printendl;,例6-11 函数指针实例,59,const float PI=3.14159f;const float TWO_PI=PI*2.0f;int main()void(*function_pointer)(float);printS
27、tuff(PI);functionPointer=printStuff;/函数指针指向printStufffunctionPointer(PI);functionPointer=printMessage;/函数指针指向printMessagefunctionPointer(TWO_PI);functionPointer(13.0);functionPointer=printFloat;/函数指针指向printFloatfunctionPointer(PI);printFloat(PI);return 0;,指针与函数,60,运行结果:This is the print stuff functi
28、on.This is the print stuff function.The data to be listed is 6.28318 The data to be listed is 13 The data to be printed is 3.14159 The data to be printed is 3.14159,61,对象指针,对象指针就是用来存放对象地址的变量。声明形式:类名*对象指针名;,对 象 指 针,例:Point A(5,10);/声明Point类的对象APiont*ptr;/声明Point类的对象指针ptr=/将对象A的地址赋给ptr,使ptr指向A,对象指针访问对
29、象成员的语法形式:对象指针名-成员名,62,对象指针应用举例,注意:(1)对象是包含了数据和函数两种成员,但对象所占据的内存空间只用于存放数据成员。(2)对象指针在使用之前一定要先进行初始化,让它指向一个程序已经声明过的对象,然后再使用。通过对象指针,可以访问到所指对象的公有成员。,对 象 指 针,例:P213 例6-12int main()Point a(4,5);Point*pl=,63,this 指针,指针this是系统自动生成的,隐含于每一个类的非静态成员函数中的特殊指针。当一个对象生成以后,系统就为这个对象定义了一个this指针,它指向这个对象的地址。例如:Point类中函数getX
30、()中语句 ruturn x;return this-x;每一个非静态成员函数都有一个this指针,当对象调用成员函数时,该成员函数的this指针便指向这个对象。这样,当不同的对象调用同一个成员函数时,编译器将根据该成员函数的this指针指向的对象确定引用哪个对象的成员函数。成员函数访问类中数据成员的形式为:this-成员变量,对 象 指 针,64,指向对象成员的指针使用前要先声明,再赋值,然后引用。声明形式为:类型说明符类名:*指针名;类型说明符(类名:*指针名)(参数表);对数据成员指针赋值形式为:指针名=&类名:数据成员名;注意:不能对类的私有成员取地址对函数成员指针赋值形式为:指针名=
31、&类名:函数成员名;,指向类的非静态成员的指针,65,访问数据成员形式为:对象名.*成员指针名;或对象名-*成员指针名;访问函数成员时,由于需要确定this指针,因而必须通过对象来调用非静态成员函数,形式为:(对象名.*类成员指针名)(参数表)(对象名-*成员指针名)(参数表),指向类的非静态成员的指针(续),66,指向类的非静态成员的指针,对 象 指 针,例:P216 例6-13int main()Point a(4,5);Point*pl=,67,对类的静态成员的访问不依赖于对象,因此可用普通指针来指向和访问静态成员,参见P216218页例6-14和例6-15:,指向类的静态成员的指针,6
32、8,#include using namespace std;class Pointpublic:Point(int x=0,int y=0):x(x),y(y)count+;Point(Point,例6-14 通过指针访问类的静态数据成员,69,private:int x,y;int Point:count=0;/静态数据成员,初始化int main()int*ptr=,70,#include using namespace std;class Pointpublic:Point(int x=0,int y=0):x(x),y(y)count+;Point(Point,例6-15 通过指针访
33、问类的静态函数成员,71,private:int x,y;static int count;int Point:count=0;/静态数据成员,初始化int main()void(*funcPtr)()=Point:showCount;Point a(4,5);coutPoint A,a.getX(),a.getY();funcPtr();Point b(a);coutPoint B,b.getX(),b.getY();funcPtr();return 0;,72,动态申请内存操作符 new,动态内存分配,堆对象:在程序运行过程中申请和释放的存储单元,该过程称为建立(new)和删除(delet
34、e)new:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。若成功,返回指向新分配的内存;否则,抛出异常new 数据类型(初始化参数列表);int*point;point=new int(2);区别:point=new int;和 point=new int();区别:若类存在默认构造函数,“new”T和“new T()”效果相同;否则,“new T()”会为基本数据类型和指针类型的成员用0赋初值,73,释放内存操作符delete,delete 指针名;功能:释放指针P所指向的内存。P必须是new操作 的返回值。注意:若被删除的是对象,则其析构函数将被调用;对于用new
35、建立的对象,只能使用delete进行一次删除操作,动态存储分配,74,例6-16 动态创建对象,#includeclass Point public:Point()X=Y=0;coutDefault Constructor called.n;Point(int xx,int yy)X=xx;Y=yy;cout Constructor called.n;Point()coutDestructor called.n;int GetX()return X;int GetY()return Y;void Move(int newX,int newY)x=newX;y=newY;private:int
36、x,y;,动态存储分配,75,int main()coutStep One:endl;Point*Ptr1=new Point;delete Ptr1;coutStep Two:endl;Ptr1=new Point(1,2);delete Ptr1;return 0;,运行结果:Step One:Default Constructor called.Destructor called.Step Two:Constructor called.Destructor called.,76,例6-17动态创建对象数组,#includeusing namespace std;class Point/类
37、的声明同例6-16,略;int main()Point*Ptr=new Point2;/创建对象数组 Ptr0.Move(5,10);/通过指针访问数组元素的成员 Ptr1.Move(15,20);/通过指针访问数组元素的成员 coutDeleting.endl;delete Ptr;/删除整个对象数组 return 0;,动态存储分配,77,运行结果:Default Constructor called.Default Constructor called.Deleting.Destructor called.Destructor called.,78,利用动态内存分配操作可实现数组的动态创
38、建。另一种更好的方法是将数组的建立和删除过程封装起来,形成动态数组类动态数组中,为防止访问数组时下标越界,应使用断言assert(包含在头文件cassert中)。当assert判断为假,则程序中止,79,例6-18动态数组类,#include#includeusing namespace std;class Point/类的声明同例6-16,略;/动态数组类class ArrayOfPointspublic:ArrayOfPoints(int size):size(size)points=new Pointsize;,ArrayOfPoints()cout=0,80,int main()int
39、 count;coutcount;ArrayOfPoints points(count);points.element(0).move(5,0);points.element(1).move(15,20);return 0;,运行结果:Please enter the count of points:2Default Constructor called.Default Constructor called.Deleting.Destructor called.Destructor called.,81,动态分配数组时应注意:,用new创建多维数组:new 类型名T下标表达式1下标表达式2;如
40、果内存申请成功,new运算返回一个指向新分配内存首地址的指针,是一个T类型的数组。例如:char(*fp)3;fp=new char23;,82,char(*fp)3;,fp,fp+1,83,例6-18动态创建多维数组,#includevoid main()float(*cp)98;int i,j,k;cp=new float898;for(i=0;i8;i+)for(j=0;j9;j+)for(k=0;k9;k+)*(*(*(cp+i)+j)+k)=i*100+j*10+k;/通过指针访问数组元素,动态存储分配,84,for(i=0;i8;i+)for(j=0;j9;j+)for(k=0;k
41、8;k+)/将指针cp作为数组名使用,/通过数组名和下标访问数组元素 coutcpijk;coutendl;coutendl;,85,动态存储分配函数(c语言),void*malloc(size);参数size:欲分配的字节数返回值:成功,则返回void型指针。失败,则返回空指针。头文件:和,动态存储分配,86,动态内存释放函数(c语言),void free(void*memblock);参数memblock:指针,指向需释放的内存。返回值:无头文件:和,动态存储分配,87,用vector创建数组对象,C+标准库提供了被封装的动态数组vector,且具有各种类型vector是一个类模板,使用形
42、式为:vector数组对象名(数组长度);例如:int x=10;vectorarr(x);用vector定义的数组对象的所有元素都会被初始化。若元素为基本数据类型,则以0初始化;若元素为类类型,则调用类的默认构造函数初始化,88,当为元素指定初值时,则所有元素具有相同初值,形式为:vector数组对象名(数组长度,元素初值);vector数组对象元素与普通数组元素具有相同的访问形式:数组对象名下标表达式vector数组对象是封装了数组的对象,对象名表示一个数组对象,而非数组的首地址vector数组对象的成员函数size()的作用是返回数组的大小,89,例6-20 vector应用举例,#in
43、clude#includeusing namespace std;double average(const vector,int main()unsigned n;coutn;vectorarr(n);coutarri;cout“Average=“average(arr)endl;return 0;,90,#include#includeusing namespace std;class Point/类的声明同例6-16,略;class ArrayOfPoints/类的声明同例6-18,略;int main()int count;coutcount;ArrayOfPoints pointsAr
44、ray1(count);pointsArray1.element(0).move(5,10);pointsArray1.element(1).move(15,20);,例6-21 对象的浅复制,深复制与浅复制,91,ArrayOfPoints pointsArray2=pointsArray1;cout“copy of pointsArray1:”endl;cout“point_0 of array2:“pointsArray2.element(0).getX()“,”pointsArray2.element(0).getY()endl;cout“point_1 of array2:“poin
45、tsArray2.element(1).getX()“,”pointsArray2.element(1).getY()endl;pointsArray1.element(0).move(25,30);pointsArray1.element(1).move(35,40);cout“After the moving of pointsArray1:”endl;cout“point_0 of array2:“pointsArray2.element(0).getX()“,”pointsArray2.element(0).getY()endl;cout“point_1 of array2:“poin
46、tsArray2.element(1).getX()“,”pointsArray2.element(1).getY()endl;ruturn 0;,例6-21 对象的浅复制(续),深复制与浅复制,根据P227页的运行结果,发现当移动pointsArray1中的点后,pointsArray2中的点也被移动。这是与预期不相符的,原因是只是浅复制(参见P222页ArrayPoints类的定义和P228页图6-11)。,92,#include#includeusing namespace std;class Point/类的声明同例6-16,略;class ArrayOfPointspublic:Ar
47、rayOfPoints(const ArrayOfPointsint main()/同例6-21,例6-22 对象的深复制,深复制与浅复制,根据P229页的运行结果,发现当移动pointsArray1中的点不再影响pointsArray2中的点。原因是深复制(参见P222页ArrayPoints类的定义、P110页深复制的定义和P229页图6-12)。,93,字符串以0作为结尾标记可将字符串常量赋值给指向常量的指针:const char*STRING1=“This is a string.”;coutSTRING1;以下三种写法等价:char str8=p,r,o,g,r,a,m,0;char
48、 str8=program;char str=program;当使用字符串处理函数时,应包含头文件cstring,字 符 串,用字符数组存储和处理字符串,94,字符串处理函数,strcat(连接),strcpy(复制),strcmp(比较),strlen(求长度),strlwr(转换为小写),strupr(转换为大写)头文件,字 符 串,95,构造函数的原型string();string(const string,字 符 串,string类,96,string类的操作符:参见P231页表6-1(操作符重载)常用成员函数介绍(参见P232页)append()、assign()、insert()、
49、substr()、find()、length()、swap(),字 符 串,string类(续),97,#include#includeusing namespace std;/根据value的值输出true或false,title为提示文字inline void test(const char*title,bool value)couttitle“returns”(value?”true”:”false”endl;int main()string s1=“DEF”;cout“s1 is”s1endl;,例6-23 string类应用举例,字 符 串,98,string s2;couts2;cout“length of s2:”s2.length()endl;/比较运算符的测试test(“s1=”ABC”,s1=”ABC”);test(“”DEF”=s1”,”DEF”=s1);/连接运算符的测试s2+=s1;cout“s2=s2+s1:”s2endl;cout“length of s2:“s2.length()endl;return 0;,字 符 串,
链接地址:https://www.31ppt.com/p-6153980.html