




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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:
3、可以定义变量的指针常量 int number=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;
4、指针数组的每个元素都是一个指针 使用原则:先赋值,后引用 例:P176、P177,13,6.2.9 指针型函数,数据类型T *函数名(参数表) /函数体 return 数据类型T的指针; ,14,6.2.10 指向函数的指针,函数指针:专门用来存入函数代码首地址的变量 一旦函数指针指向了某个函数,即可使用函数指针来调用函数 声明:数据类型 (*函数指针名)(形参表); 赋值:函数指针名=函数名; 调用:函数指针名(形参); 注意:该指针只能指向已经声明,且与该函数指针具有相同返回值类型和相同形参表的函数 例:P180,15,6.2.11 对象指针的一般概念,对象指针是用于存放对象地址的变量 声
5、明形式 类名 *对象指针名; Point A(5,10); Piont *ptr; ptr=,16,对象指针应用举例,#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
6、; ;,19,this指针(P182),类对象维护自己的状态变量,同一个类的对象只有一个成员函数的拷贝 那么,成员函数在被调用时如何访问对象变量呢? 要使用特殊的指针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
7、Time:showTime(void) couthrs : mins : secs endl; ,21,Time aTime,bTime; 生成了两个对象,每个对像有自己的内存地址 仅对数据成员分配内存空间 而内存中所有对象只有一个showTime()之类的成员函数的一个拷贝 如果对每个对象分别存储成员函数代码,则是浪费空间 假设一个包含1000个Time对象的数组,如果类的每个实例都存储同一函数的代码,则要在内存中放上函数的1000个拷贝,而这些拷贝都是一样的,22,为了避免这种情形,我们只存储每个成员函数的一个拷贝,类的每个实例使用相同函数,成员函数1:showTime(); 成员函数2:
8、setTime();,所有对象共享成员函数的同一拷贝,23,aTime.showTime(); bTime.showTime(); 用对象名来保证函数使用正确的对象 但仅提供对象名是不够的,函数还需要知道对象在内存中的地址 aTime.showTime();调用时将aTime对象地址自动传递到showTime()成员函数 编译器自动生成引用对象的地址,并将这个地址作为隐藏的第一个变元传入成员函数,24,编译器对showTime()使用的形参表为 showTime(Time *this); 编译器使用的实际参数调用为 showTime( 例:this指针,25,注意,在一般的程序设计中,通常不直
9、接使用this指针来引用对象成员 主要在两种情形中使用 要返回发送到函数的指针时 return *this; 多个变量同名时,使用this指针澄清所指的是哪个变量 this-hour=hour;,26,说明,this指针是隐含于每一个类的成员函数中的特殊指针(包括构造函数和析构函数) 每次调用非静态成员函数时,自动提供this指针 this指针指向各个对象,每次调用成员函数时,把这个对象的this指针作为隐藏的第一个变元传入成员函数 this指针是一个常量,不能修改。,27,指向类的非静态成员的指针(P183),可以使用指针直接指向对象的成员 通过指向成员的指针只能访问公有成员 指向公有成员变
10、量的指针 指向公有成员函数的指针,28,指向类的非静态公有数据成员的指针,类型说明符 类名:*指针名; 指针名= int *pn=new int(2); 注意: 变量是指针变量。 类型是char、int或float数据类型。 左边的变量应与右边的变量类型匹配。 new运算符无法从自由空间分配存储时(即没有满足请求的内存容量时),返回一个null指针,33,用delete运算符释放内存 delete 指针变量; 注意: delete运算符只释放自由内存字节,而不删除自由存储地址的指针 一定要配对地使用new主和delete,否则将发生内存泄漏 如果被删除的是对象,则调用该对象的析构函数 对于用n
11、ew建立的对象,只能使用delete进行一次删除操作,否则将导致运行错误,34,两种类型的指针变量: 静态指针。 先声明一个变量。 然后声明一个相同类型的指针,将变量的地址赋给指针。 该指针就是静态指针。 它的生存期在书写程序时确定,或者说它的生存期是由变量确定的。 例:int iNum=100; int *iPtr=,35,动态指针:在程序需要附加内存时创建。 int *iPtr=new int; *iPtr=10; *iPtr=*iPtr+10; cout“*iPtr=”*iptrendl; delete iPtr; 指针变量的作用域和生存期在new 和delete之间。,36,使用new
12、创建动态数组,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来释放 对空指针使用delete是安全的
13、 不能使用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,存在两种形式的类,类中仅存在变量或对象,不具备指针成员 缺省的拷贝构造
14、函数和赋值运算符函数是浅拷贝的方式 该方式通过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,浅拷贝的不良结果是
15、: b.p原先指向的堆空间悬空 既无法索引也不能收回这片内存 a或b对象的析构函数诱发中间共享的深资源的流失,44,例:对象的浅拷贝(P192),拷贝前,拷贝后,45,46,如果类中包含了使用new初始化的指针成员,应当定义一个拷贝构造函数,以复制指向的数据,而不是指针,47,例:对象的深拷贝(P194),拷贝前,拷贝后,48,49,深拷贝的核心思路是: 目标对象与源对象内存空间独立,相应指针成员指向的内存空间也彼此独立 全部拷贝源对象的数据到目标对象,包括分别拷贝指针成员指向的内存数据 应定义一个拷贝构造函数,通过深拷贝将一个对象初始化为另一个对象 拷贝构造函数应分配足够的空间来存储复制的数
16、据,并复制数据,而不仅仅是数据的地址。另外还应更新所有受影响的静态类成员。 应当定义一个赋值运算符,通过深拷贝将一个对象复制给另一个对象,50,在构造函数中使用new中应注意的问题: 如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete释放 new和delete必须相互兼容。 new对应delete new对应 delete 如果有多个构造函数,则必须以相同的方式使用new,要么都带,要么都不带。因为只有一个析构函数,51,6.5.2 string类,用string类的变量存储字符串 必须在程序中包含头文件 string类位于名称空间std中 string类封装了串的属
17、性并提供了一系列允许访问这些属性的服务 使用string对象的方式与使用字符数组相同 类设计让程序能够自动处理string的大小,52,类的数据组件 字符序列 字符序列的大小或长度 序列中字符的类型 字符的特点 一个字符的大小 分配算符 迭代器 有关串操作的服务 查找、分配、连接、追加,53,构造函数 string(); string(const string ,54,常用成员函数,string append(const char *s); 添加串对象、字符数组或单个字符到另一个串对象 string assign(const char *s); int compare(const string
18、 ,55,size() ,返回string对象元素的个数 resize(),用来改变string对象的大小 erase(),返回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=str1+str2+!; str1+=str2; str1+=!; 字符串的下标 可以用下标运算符或成员函数at(int)来检索字符串的某个字符或修改字符串中的某个字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中国科学院精密测量科学与技术创新研究院招聘笔试历年参考题库附带答案详解
- 行政执法人员考试题库及答案
- 证券从业资格考试《证券投资顾问业务》真题及解析-模拟试题卷
- 交通部危险货物道路运输安全管理办法
- 护理讲课比赛
- 幼儿园暑假安全教育主题
- 健康医扶贫员培训课件
- 安徽省江淮协作区2024-2025学年高一下学期期末考试地理试卷(图片版含答案)
- 2024年山东省东阿县人民医院公开招聘护理工作人员试题带答案详解
- 中国吸塑包装片材机组行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- T/DGGC 022-2023盾构机保养与维修技术规范
- 江苏省南京市鼓楼区金陵汇文中学2025年七下数学期末监测试题含解析
- 2025家居生活方式消费趋势洞察报告
- 2024年宁夏妇女儿童医院招聘事业单位工作人员真题
- 国家开放大学《药物治疗学(本)》形考作业1-4参考答案
- 成都设计咨询集团有限公司2025年社会公开招聘(19人)笔试参考题库附带答案详解
- 灭火器培训试题及答案
- 女性不孕症中西医结合诊疗指南
- 快递站转让合同协议书范本
- 禁止黄赌毒协议书模板
- 矿泉水销售合同协议
评论
0/150
提交评论