数组指针与字符串.ppt

上传人:牧羊曲112 文档编号:5986263 上传时间:2023-09-11 格式:PPT 页数:62 大小:364.50KB
返回 下载 相关 举报
数组指针与字符串.ppt_第1页
第1页 / 共62页
数组指针与字符串.ppt_第2页
第2页 / 共62页
数组指针与字符串.ppt_第3页
第3页 / 共62页
数组指针与字符串.ppt_第4页
第4页 / 共62页
数组指针与字符串.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《数组指针与字符串.ppt》由会员分享,可在线阅读,更多相关《数组指针与字符串.ppt(62页珍藏版)》请在三一办公上搜索。

1、第六章 数组、指针与字符串,C+语言程序设计,2,本章主要内容,数组指针动态存储分配指针与数组深拷贝与浅拷贝字符串,3,6.1.4 对象数组(P163),声明:类名 数组名元素个数;访问方法:通过下标访问 数组名下标.成员名,4,对象数组初始化,数组中每一个元素对象被创建时,系统都会调用该类的构造函数初始化该对象通过初始化列表赋值Point A2=Point(1,2),Point(3,4);如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数),5,数组元素所属类的构造函数,不声明构造函数,则采用默认构造函数各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构

2、造函数各元素对象的初值要求为不同的值时,需要声明带形参的构造函数当数组中每一个对象被删除时,系统都要调用一次析构函数,6,例:对象数组应用举例(L6_对象数组)例:利用Point类进行点的线性拟合(P165),7,指针,情形1:定义寻址一个常量的指针int number=10;const int*pn=,有效赋值,无效赋值,不能通过pn改变x的值,有效赋值,无效赋值,不能通过pn改变x的值,8,情形2:const变量地址只能赋予一个常量的指针const int number=10;const int*pn=,有效赋值,无效赋值,有效赋值,9,情形3:可以定义变量的指针常量int number=

3、10;int*const pn=,有效赋值,有效赋值,无效赋值,不能改变const指针,10,情形4:可以用限定符号声明指针常量,指向常量值const int number=10;const int*const pn=,有效赋值,无效赋值,无效赋值,不能改变const指针,11,void指针:任何类型的指针都可以赋值给void类型的指针变量经过强制类型转换,通过 void类型的指针便可以访问任何类型的数据也可以指向除类成员函数以外的函数例:P172,12,6.2.7 指针数组,类型名*数组名下标表达式;int*p10;指针数组的每个元素都是一个指针使用原则:先赋值,后引用例:P176、P177

4、,13,6.2.9 指针型函数,数据类型T*函数名(参数表)/函数体 return 数据类型T的指针;,14,6.2.10 指向函数的指针,函数指针:专门用来存入函数代码首地址的变量一旦函数指针指向了某个函数,即可使用函数指针来调用函数声明:数据类型(*函数指针名)(形参表);赋值:函数指针名=函数名;调用:函数指针名(形参);注意:该指针只能指向已经声明,且与该函数指针具有相同返回值类型和相同形参表的函数例:P180,15,6.2.11 对象指针的一般概念,对象指针是用于存放对象地址的变量声明形式类名*对象指针名;Point A(5,10);Piont*ptr;ptr=,16,对象指针应用举

5、例,#include using namespace std;void main()Point A(5,10);Point*ptr;ptr=,17,曾经出现过的错误例子,class Fred;/前向引用声明class Barney Fred x;/错误:类Fred的声明尚不完善;class Fred Barney y;,18,正确的程序,class Fred;/前向引用声明class Barney Fred*x;class Fred Barney y;,19,this指针(P182),类对象维护自己的状态变量,同一个类的对象只有一个成员函数的拷贝那么,成员函数在被调用时如何访问对象变量呢?要使

6、用特殊的指针this指针this指针隐含于每个类的成员函数中,它指向正在被成员函数操作的对象,每次调用成员函数时,这个对象的this指针就作为隐藏成员传递给成员函数,20,class 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 endl;,21,Time aTime,bTime;生成了两个对象,每个对像有自己的内存地址仅对数据成员分

7、配内存空间而内存中所有对象只有一个showTime()之类的成员函数的一个拷贝如果对每个对象分别存储成员函数代码,则是浪费空间假设一个包含1000个Time对象的数组,如果类的每个实例都存储同一函数的代码,则要在内存中放上函数的1000个拷贝,而这些拷贝都是一样的,22,为了避免这种情形,我们只存储每个成员函数的一个拷贝,类的每个实例使用相同函数,成员函数1:showTime();成员函数2:setTime();,所有对象共享成员函数的同一拷贝,23,aTime.showTime();bTime.showTime();用对象名来保证函数使用正确的对象但仅提供对象名是不够的,函数还需要知道对象在

8、内存中的地址aTime.showTime();调用时将aTime对象地址自动传递到showTime()成员函数编译器自动生成引用对象的地址,并将这个地址作为隐藏的第一个变元传入成员函数,24,编译器对showTime()使用的形参表为 showTime(Time*this);编译器使用的实际参数调用为 showTime(例:this指针,25,注意,在一般的程序设计中,通常不直接使用this指针来引用对象成员主要在两种情形中使用要返回发送到函数的指针时return*this;多个变量同名时,使用this指针澄清所指的是哪个变量this-hour=hour;,26,说明,this指针是隐含于每一

9、个类的成员函数中的特殊指针(包括构造函数和析构函数)每次调用非静态成员函数时,自动提供this指针this指针指向各个对象,每次调用成员函数时,把这个对象的this指针作为隐藏的第一个变元传入成员函数this指针是一个常量,不能修改。,27,指向类的非静态成员的指针(P183),可以使用指针直接指向对象的成员通过指向成员的指针只能访问公有成员指向公有成员变量的指针指向公有成员函数的指针,28,指向类的非静态公有数据成员的指针,类型说明符 类名:*指针名;指针名=&类名:数据成员名;/说明指针应该指向哪个成员通过对象名(或对象指针)与成员指针结合来访问数据成员对象名.*类成员指针名对象指针名*类

10、成员指针名,29,指向类的非静态公有成员函数的指针,类型说明符(类名:*指针名)(形参表);指针名=&类名:成员函数名;通过对象名(或对象指针)与成员指针结合来访问成员函数(对象名.*类成员指针名)(参数表)(对象指针名*类成员指针名)(参数表)例:L6_非静态指针,30,指向类的静态成员的指针,对类的静态成员的访问不依赖于对象可以用普通的指针来指向和访问静态成员通过指针访问类的静态数据成员L6_静态指针1通过指针访问类的静态函数成员L6_静态指针2,31,6.3 动态内存分配(P186),动态分配是程序在运行时得到内存的手段保证程序在运行过程中按照实际需要申请适量的内存,使用结束后还可以释放

11、在程序运行过程中申请和释放的存储单元也称为:堆对象申请和释放过程称为:建立和删除,32,new和delete运算符,用new运算符获得内存new运算符的语法类型 指针变量=new 类型;int*pn=new int;int*pn=new int(2);注意:变量是指针变量。类型是char、int或float数据类型。左边的变量应与右边的变量类型匹配。new运算符无法从自由空间分配存储时(即没有满足请求的内存容量时),返回一个null指针,33,用delete运算符释放内存delete 指针变量;注意:delete运算符只释放自由内存字节,而不删除自由存储地址的指针一定要配对地使用new主和de

12、lete,否则将发生内存泄漏如果被删除的是对象,则调用该对象的析构函数对于用new建立的对象,只能使用delete进行一次删除操作,否则将导致运行错误,34,两种类型的指针变量:静态指针。先声明一个变量。然后声明一个相同类型的指针,将变量的地址赋给指针。该指针就是静态指针。它的生存期在书写程序时确定,或者说它的生存期是由变量确定的。例:int iNum=100;int*iPtr=,35,动态指针:在程序需要附加内存时创建。int*iPtr=new int;*iPtr=10;*iPtr=*iPtr+10;cout“*iPtr=”*iptrendl;delete iPtr;指针变量的作用域和生存期

13、在new 和delete之间。,36,使用new创建动态数组,int*ps=new int10;ps0=1;delete ps;,37,动态创建对象:Point*p1=new Point;Point*p2=new Point(1,2);delete p1;Delete p2;动态创建对象数组:Point*ptr=new Point2;例:new对象指针,38,应遵守的规则不要使用delete 来释放不是new分配的内存不要使用delete 释放同一个内存块多次如果使用new为一个实体分配内存,则应使用delete来释放如果使用new为数组分配内存,则应使用delete来释放对空指针使用dele

14、te是安全的不能使用sizeof操作符来确定动态分配的数组包含的字节数,39,使用new创建动态结构,struct student char name20;int age;float score;student*ps=new student;cin.get(ps-name,20);cin(*ps).age;cinps-socre;,40,浅拷贝与深拷贝,浅拷贝实现对象间数据元素的一一对应复制默认的拷贝构造函数深拷贝当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制,41,存在两种形式的类,类中仅存在变量或对象,不具备指针成员缺省的拷贝构造函数和赋值运算符函

15、数是浅拷贝的方式该方式通过memcpy函数将源实例的数据复制给目标实例占有的一片内存空间对于这样的类,缺省的浅拷贝方式是安全的类含有指针成员浅拷贝不再胜任这样的类,42,考虑如下说明:,一个CDeep类的声明和对象定义,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对象的动态内存,43,浅拷贝的不良结果是:b.p原先指向的堆空间悬空既无法索引也

16、不能收回这片内存a或b对象的析构函数诱发中间共享的深资源的流失,44,例:对象的浅拷贝(P192),拷贝前,拷贝后,45,46,如果类中包含了使用new初始化的指针成员,应当定义一个拷贝构造函数,以复制指向的数据,而不是指针,47,例:对象的深拷贝(P194),拷贝前,拷贝后,48,49,深拷贝的核心思路是:目标对象与源对象内存空间独立,相应指针成员指向的内存空间也彼此独立全部拷贝源对象的数据到目标对象,包括分别拷贝指针成员指向的内存数据应定义一个拷贝构造函数,通过深拷贝将一个对象初始化为另一个对象拷贝构造函数应分配足够的空间来存储复制的数据,并复制数据,而不仅仅是数据的地址。另外还应更新所有

17、受影响的静态类成员。应当定义一个赋值运算符,通过深拷贝将一个对象复制给另一个对象,50,在构造函数中使用new中应注意的问题:如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete释放new和delete必须相互兼容。new对应delete new对应 delete如果有多个构造函数,则必须以相同的方式使用new,要么都带,要么都不带。因为只有一个析构函数,51,6.5.2 string类,用string类的变量存储字符串必须在程序中包含头文件string类位于名称空间std中string类封装了串的属性并提供了一系列允许访问这些属性的服务使用string对象的方式与使用

18、字符数组相同类设计让程序能够自动处理string的大小,52,类的数据组件字符序列字符序列的大小或长度序列中字符的类型字符的特点一个字符的大小分配算符迭代器有关串操作的服务查找、分配、连接、追加,53,构造函数string();string(const string,54,常用成员函数,string append(const char*s);添加串对象、字符数组或单个字符到另一个串对象string assign(const char*s);int compare(const string,55,size(),返回string对象元素的个数resize(),用来改变string对象的大小eras

19、e(),返回string对象中的所有字符empty(),如果size=0,返回true,56,构造string 类对象,构造一个空的string对象string str1;用一个字符串数组构造一个string对象string str2(China);用一个string对象构造另一个string对象string str3(str2);,57,给字符串对象赋值,将一个字符赋值给一个string对象str1=a;将一个字符数组赋值给一个string对象str2=Wust;将一个string对象赋给另一个string对象str3=str2;,58,字符串的连接str3=str1+str2;str3=s

20、tr1+str2+!;str1+=str2;str1+=!;字符串的下标可以用下标运算符或成员函数at(int)来检索字符串的某个字符或修改字符串中的某个字符char ch1=str31;char ch2=str3.at(1);str32=w;str3.at(2)=h;,59,字符串的子串substr(int,int)第一个参数是子串在原串中的起始位置(从0开始)第二个参数是子串的字符个数string str4;str4=str3.substr(1,3);,60,串长str1.size();字符串的比较string对象支持所有的关系运算符,可以把两个字符串对象或字符串对象和以空字符结尾的字符数组进行比较if(str1=str2)if(str1 abcd),61,例:P199,62,程序实例:P201,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号