第6章数组指针与字符串

上传人:新** 文档编号:585554267 上传时间:2024-09-02 格式:PPT 页数:62 大小:492.52KB
返回 下载 相关 举报
第6章数组指针与字符串_第1页
第1页 / 共62页
第6章数组指针与字符串_第2页
第2页 / 共62页
第6章数组指针与字符串_第3页
第3页 / 共62页
第6章数组指针与字符串_第4页
第4页 / 共62页
第6章数组指针与字符串_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《第6章数组指针与字符串》由会员分享,可在线阅读,更多相关《第6章数组指针与字符串(62页珍藏版)》请在金锄头文库上搜索。

1、第六章第六章第六章第六章 数组、指针与字符串数组、指针与字符串数组、指针与字符串数组、指针与字符串C+语言程序设计本章主要内容本章主要内容u数组数组u指针指针u动态存储分配动态存储分配u指针与数组指针与数组u深拷贝与浅拷贝深拷贝与浅拷贝u字符串字符串26.1.4 6.1.4 对象数组对象数组(P163)(P163)u声明:声明: 类名 数组名元素个数;u访问方法:通过下标访问访问方法:通过下标访问 数组名下标. .成员名3对象数组初始化对象数组初始化u数组中每一个元素对象被创建时,系统都会数组中每一个元素对象被创建时,系统都会调用该类的构造函数初始化该对象调用该类的构造函数初始化该对象u通过初

2、始化列表赋值通过初始化列表赋值Point A2=Point(1,2),Point(3,4);u如果没有为数组元素指定显式初始值,数组如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函元素便使用默认值初始化(调用默认构造函数)数)4数组元素所属类的构造函数数组元素所属类的构造函数u不声明构造函数,则采用默认构造函数不声明构造函数,则采用默认构造函数u各元素对象的初值要求为相同的值时,可各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数以声明具有默认形参值的构造函数u各元素对象的初值要求为不同的值时,需各元素对象的初值要求为不同的值时,需要声明带形参的构造

3、函数要声明带形参的构造函数u当数组中每一个对象被删除时,系统都要当数组中每一个对象被删除时,系统都要调用一次析构函数调用一次析构函数5u例例: : 对象数组应用举例对象数组应用举例(L6_(L6_对象数组对象数组) )u例例: : 利用利用PointPoint类进行点的线性拟合类进行点的线性拟合(P165)(P165)6指针指针u情形情形1:定义寻址一个常量的指针:定义寻址一个常量的指针nint number=10;nconst int *pn=&number;npn是常量整数的指针,pn所指的值不能通过pn改变,但是可以改变pn,寻址int类型的不同变量int x=1,y=2;pn=&x;*

4、pn=6;pn=&y;*pn+=1;有效赋值无效赋值,不能通过pn改变x的值有效赋值无效赋值,不能通过pn改变x的值7u情形情形2:const变量地址只能赋予一个常量的指针变量地址只能赋予一个常量的指针nconst int number=10;nconst int *pn=&number;n但是常量指针可以变为普通变量的新地址const int x=1; int y=2;const int *apn;int *bpn;apn=&x;bpn=&x;apn=&y;有效赋值无效赋值有效赋值8u情形情形3:可以定义变量的指针常量:可以定义变量的指针常量nint number=10;nint * con

5、st pn=&number; npn是个指针常量,指向整数n这个整数可变,但指针常量不能指向别的地方int x=1,y=2;int * const apn;apn=&x;*apn=6;apn=&y;有效赋值有效赋值无效赋值,不能改变const指针9u情形情形4:可以用限定符号声明指针常量,指向常:可以用限定符号声明指针常量,指向常量值量值nconst int number=10;nconst int * const pn=&number; npn是个常量整数的指针常量npn所指的值不能改变,pn也不能指向别的地方const int x=1;int y=2;const int * const a

6、pn=&x;*apn=6;apn=&y;有效赋值无效赋值无效赋值,不能改变const指针10uvoidvoid指针:指针:n任何类型的指针都可以赋值给void类型的指针变量n经过强制类型转换,通过 void类型的指针便可以访问任何类型的数据n也可以指向除类成员函数以外的函数n例:P116.2.7 6.2.7 指针数组指针数组 u类型名类型名 * *数组名数组名 下标表达式下标表达式;u intint *p10; *p10;u指针数组的每个元素都是一个指针指针数组的每个元素都是一个指针u使用原则:先赋值,后引用使用原则:先赋值,后引用u例:例:P176P176、P177P126.2.9 6.2.

7、9 指针型函数指针型函数u 数据类型数据类型T *T *函数名(参数表)函数名(参数表)u u / /函数体函数体u return return 数据类型数据类型T T的指针;的指针;u 136.2.10 6.2.10 指向函数的指针指向函数的指针u函数指针:专门用来存入函数代码首地址的变量函数指针:专门用来存入函数代码首地址的变量u一旦函数指针指向了某个函数,即可使用函数指一旦函数指针指向了某个函数,即可使用函数指针来调用函数针来调用函数u声明:数据类型声明:数据类型 (*(*函数指针名函数指针名)()(形参表形参表) );u赋值:函数指针名赋值:函数指针名= =函数名;函数名;u调用:函数

8、指针名调用:函数指针名( (形参形参) );u注意:该指针只能指向已经声明,且与该函数指注意:该指针只能指向已经声明,且与该函数指针具有相同返回值类型和相同形参表的函数针具有相同返回值类型和相同形参表的函数u例:例:P180P146.2.11 6.2.11 对象指针的一般概念对象指针的一般概念u对象指针是用于存放对象地址的变量对象指针是用于存放对象地址的变量u声明形式声明形式类名 *对象指针名;u Point A(5,10);Point A(5,10);Piont *ptr;ptr=&A;u通过指针访问对象成员通过指针访问对象成员对象指针名-成员名ptr-getx() 相当于 (*ptr).g

9、etx();15对象指针应用举例对象指针应用举例#include using namespace std;void main() Point A(5,10); Point *ptr; ptr=&A; int x; x=ptr-GetX(); /x=(*ptr).GetX(); coutxendl;16曾经出现过的错误例子曾经出现过的错误例子class Fred; /前向引用声明前向引用声明class Barney Fred x;/错误:类错误:类Fred的声明尚不完善的声明尚不完善 ;class Fred Barney y; ;17正确的程序正确的程序class Fred; /前向引用声明前向

10、引用声明class Barney Fred *x; ;class Fred Barney y;18thisthis指针(指针(P182P182)u类对象维护自己的状态变量,同一个类的类对象维护自己的状态变量,同一个类的对象只有一个成员函数的拷贝对象只有一个成员函数的拷贝u那么,成员函数在被调用时如何访问对象那么,成员函数在被调用时如何访问对象变量呢?变量呢?u要使用特殊的指针要使用特殊的指针thisthis指针指针uthisthis指针隐含于每个类的成员函数中,它指针隐含于每个类的成员函数中,它指向正在被成员函数操作的对象,每次调指向正在被成员函数操作的对象,每次调用成员函数时,这个对象的用成

11、员函数时,这个对象的thisthis指针就作指针就作为隐藏成员传递给成员函数为隐藏成员传递给成员函数19class Time public: Time(); Time (); void showTime(); void setTime(int hour,int minute,int second);private: int hrs, mins, secs;void Time:showTime(void) couthrs : mins : secs hour=hour;25说明说明uthisthis指针是隐含于每一个类的成员函数中指针是隐含于每一个类的成员函数中的特殊指针(包括构造函数和析构函数

12、)的特殊指针(包括构造函数和析构函数)u每次调用非静态成员函数时,自动提供每次调用非静态成员函数时,自动提供thisthis指针指针uthisthis指针指向各个对象,每次调用成员函指针指向各个对象,每次调用成员函数时,把这个对象的数时,把这个对象的thisthis指针作为隐藏的指针作为隐藏的第一个变元传入成员函数第一个变元传入成员函数uthisthis指针是一个常量,不能修改。指针是一个常量,不能修改。26指向类的非静态成员的指针(指向类的非静态成员的指针(P183P183)u可以使用指针直接指向对象的成员可以使用指针直接指向对象的成员u通过指向成员的指针只能访问公有成员通过指向成员的指针只

13、能访问公有成员n指向公有成员变量的指针指向公有成员变量的指针n指向公有成员函数的指针指向公有成员函数的指针27指向类的非静态公有指向类的非静态公有数据成员数据成员的指针的指针u类型说明符 类名:*指针名;u指针名=& &类名:数据成员名; /说明指针应该指向哪个成员u通过对象名(或对象指针)与成员指针结合来访问数据成员n对象名对象名.* .* 类成员指针名类成员指针名n对象指针名对象指针名* *类成员指针名类成员指针名28指向类的非静态公有指向类的非静态公有成员函数成员函数的指针的指针u类型说明符 (类名:*指针名)(形参表);u指针名=& &类名:成员函数名;u通过对象名(或对象指针)与成员

14、指针结合来访问成员函数n( (对象名对象名.*.*类成员指针名类成员指针名)()(参数表参数表) )n( (对象指针名对象指针名* *类成员指针名类成员指针名)()(参数表参数表) )u例例:L6_:L6_非静态指针非静态指针29指向类的静态成员的指针指向类的静态成员的指针u对类的静态成员的访问不依赖于对象对类的静态成员的访问不依赖于对象u可以用普通的指针来指向和访问静态成员可以用普通的指针来指向和访问静态成员u通过指针访问类的静态数据成员通过指针访问类的静态数据成员nL6_静态指针1u通过指针访问类的静态函数成员通过指针访问类的静态函数成员nL6_静态指针306.3 6.3 动态内存分配动态

15、内存分配(P186)u动态分配是程序在运行时得到内存的手段动态分配是程序在运行时得到内存的手段u保证程序在运行过程中按照实际需要申请保证程序在运行过程中按照实际需要申请适量的内存,使用结束后还可以释放适量的内存,使用结束后还可以释放u在程序运行过程中申请和释放的存储单元在程序运行过程中申请和释放的存储单元也称为:堆对象也称为:堆对象u申请和释放过程称为:建立和删除申请和释放过程称为:建立和删除31 new和和delete运算符运算符u用用new运算符获得内存运算符获得内存unew运算符的语法运算符的语法n类型 指针变量=new 类型;nint *pn=new int;nint *pn=new

16、int(2);u注意:注意:n变量是指针变量。n类型是char、int或float数据类型。n左边的变量应与右边的变量类型匹配。nnew运算符无法从自由空间分配存储时(即没有满足请求的内存容量时),返回一个null指针32u用用delete运算符释放内存运算符释放内存ndelete 指针变量;u注意:注意:ndelete运算符只释放自由内存字节,而不删除自由存储地址的指针n一定要配对地使用new主和delete,否则将发生内存泄漏n如果被删除的是对象,则调用该对象的析构函数n对于用new建立的对象,只能使用delete进行一次删除操作,否则将导致运行错误33两种类型的指针变量:两种类型的指针变

17、量:静态指针。n先声明一个变量。n然后声明一个相同类型的指针,将变量的地址赋给指针。n该指针就是静态指针。n它的生存期在书写程序时确定,或者说它的生存期是由变量确定的。n例:int iNum=100;n int *iPtr=&iNum;34n动态指针:在程序需要附加内存时创建。 int *iPtr=new int;*iPtr=10;*iPtr=*iPtr+10;cout“*iPtr=”*iptrname,20);cin(*ps).age;cinps-socre;39浅拷贝与深拷贝浅拷贝与深拷贝u浅拷贝浅拷贝n实现对象间数据元素的一一对应复制n默认的拷贝构造函数u深拷贝深拷贝n当被复制的对象数据

18、成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制40存在两种形式的类存在两种形式的类u类中仅存在变量或对象,不具备指针成员类中仅存在变量或对象,不具备指针成员n缺省的拷贝构造函数和赋值运算符函数是浅拷贝的方式n该方式通过memcpy函数将源实例的数据复制给目标实例占有的一片内存空间n对于这样的类,缺省的浅拷贝方式是安全的u类含有指针成员类含有指针成员n浅拷贝不再胜任这样的类41考虑如下说明:考虑如下说明:一个一个CDeep类的声明和对象定义类的声明和对象定义 a.n a.p a.p=new inta.n b.n b.p b.p=new intb.n?=new intb.n

19、a.n a.pa.p=new inta.nb.n b.p class CDeep public: private: int n; int*p; a, b;中间深资源归口两个对象监控中间深资源归口两个对象监控对于存在指针成员的类,系统提供的浅拷贝对于存在指针成员的类,系统提供的浅拷贝导致指针指向的内存为两个对象共享的格局导致指针指向的内存为两个对象共享的格局对象对象a,b的内存和指针成员动态扩展的内存空间的内存和指针成员动态扩展的内存空间b=a导致导致 b.p=a.p; b.n=a.n; 。指针。指针b.p指向指向a对象的动态内存对象的动态内存42u浅拷贝的不良结果是:浅拷贝的不良结果是:ub.

20、pb.p原先指向的堆空间悬空原先指向的堆空间悬空n既无法索引也不能收回这片内存na或b对象的析构函数诱发中间共享的深资源的流失43u例例: :对象的浅拷贝(对象的浅拷贝(P192P192)44拷贝前拷贝后pointsArray1的数组元素占用的内存pointsnumberOfPointspointsArray1pointsnumberOfPointspointsArray1pointsArray1的数组元素占用的内存pointsnumberOfPointspointsA45u如果类中包含了使用new初始化的指针成员,应当定义一个拷贝构造函数,以复制指向的数据,而不是指针46u例例: :对象的深

21、拷贝(对象的深拷贝(P194P194)47拷贝前pointsArray1的数组元素占用的内存pointsnumberOfPointspointsArray1拷贝后pointsnumberOfPointspointsArray1pointsArray1的 数组元素占用的内存pointsnumberOfPointspointsA48u深拷贝的核心思路是:深拷贝的核心思路是:n目标对象与源对象内存空间独立,相应指针成员指向的内存空间也彼此独立n全部拷贝源对象的数据到目标对象,包括分别拷贝指针成员指向的内存数据u应定义一个拷贝构造函数,通过深拷贝将一个对应定义一个拷贝构造函数,通过深拷贝将一个对象初始

22、化为另一个对象象初始化为另一个对象u拷贝构造函数应分配足够的空间来存储复制的数拷贝构造函数应分配足够的空间来存储复制的数据,并复制数据,而不仅仅是数据的地址。另外据,并复制数据,而不仅仅是数据的地址。另外还应更新所有受影响的静态类成员。还应更新所有受影响的静态类成员。u应当定义一个赋值运算符,通过深拷贝将一个对应当定义一个赋值运算符,通过深拷贝将一个对象复制给另一个对象象复制给另一个对象49u在构造函数中使用在构造函数中使用new中应注意的问题:中应注意的问题:n如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete释放nnew和delete必须相互兼容。n new对应d

23、eleten new对应 deleten如果有多个构造函数,则必须以相同的方式使用new,要么都带,要么都不带。因为只有一个析构函数506.5.2 string类类u用用string类的变量存储字符串类的变量存储字符串u必须在程序中包含头文件必须在程序中包含头文件ustring类位于名称空间类位于名称空间std中中ustring类封装了串的属性并提供了一系列类封装了串的属性并提供了一系列允许访问这些属性的服务允许访问这些属性的服务u使用使用string对象的方式与使用字符数组相对象的方式与使用字符数组相同同u类设计让程序能够自动处理类设计让程序能够自动处理string的大小的大小51u类的数据

24、组件类的数据组件n字符序列n字符序列的大小或长度n序列中字符的类型n字符的特点n一个字符的大小n分配算符n迭代器u有关串操作的服务有关串操作的服务n查找、分配、连接、追加52u构造函数构造函数nstring();nstring(const string &rhs);nstring(const char *s);nstring(const string &rhs,unsigned int pos,unsigned int n);nstring(const char *s,unsigned int n);nstring(unsigned int n,char c);53常用成员函数常用成员函数us

25、tring append(const char *s);u添加串对象、字符数组或单个字符到另一个串对象添加串对象、字符数组或单个字符到另一个串对象ustring assign(const char *s);uint compare(const string &str)const;ustring& insert(unsigned int p0,const char *s);ustring substr(unsigned int pos, unsigned int n)const; uunsigned int find(const basic_string &str)const);uunsigne

26、d int length()const;uvoid swap(string &str);54usize() ,返回返回string对象元素的个数对象元素的个数uresize(),用来改变用来改变string对象的大小对象的大小uerase(),返回返回string对象中的所有字符对象中的所有字符uempty(),如果如果size=0,返回,返回55构造string 类对象u构造一个空的构造一个空的string对象对象nstring str1;u用一个字符串数组构造一个用一个字符串数组构造一个string对象对象nstring str2(China);u用一个用一个string对象对象构造另一个

27、构造另一个string对象对象nstring str3(str2);56给字符串对象赋值给字符串对象赋值u将一个字符赋值给一个将一个字符赋值给一个string对象对象nstr1=a;u将一个字符数组赋值给一个将一个字符数组赋值给一个string对象对象nstr2=Wust;u将一个将一个string对象赋给另一个对象赋给另一个string对象对象nstr3=str2;57u字符串的连接字符串的连接nstr3=str1+str2;nstr3=str1+str2+!;nstr1+=str2;nstr1+=!;u字符串的下标字符串的下标n可以用下标运算符或成员函数at(int)来检索字符串的某个字符

28、或修改字符串中的某个字符nchar ch1=str31;nchar ch2=str3.at(1);nstr32=w;nstr3.at(2)=h;58u字符串的子串字符串的子串nsubstr(int,int)n第一个参数是子串在原串中的起始位置(从0开始)n第二个参数是子串的字符个数nstring str4;nstr4=str3.substr(1,3);59u串长串长nstr1.size();u字符串的比较字符串的比较nstring对象支持所有的关系运算符,可以把两个字符串对象或字符串对象和以空字符结尾的字符数组进行比较nif(str1 = str2)nif(str1 abcd)60u例:例:P199P61u程序实例:程序实例:P201P62

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号