第14章堆和拷贝构造函数ppt课件_第1页
第14章堆和拷贝构造函数ppt课件_第2页
第14章堆和拷贝构造函数ppt课件_第3页
第14章堆和拷贝构造函数ppt课件_第4页
第14章堆和拷贝构造函数ppt课件_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、一、教学目的: 要求掌握C+对内存的管理方法,能灵活使用new和delete运算符对堆进行操作。理解和正确使用拷贝构造函数,理解临时对象和无名对象的概念。二、教学重点: 通过大量的例程的分析,使学生正确掌握堆的分配释放操作,拷贝构造函数的使用。三、教学难点: 深拷贝和浅拷贝的区别,临时对象和无名对象的理解。本次授课时数:6学时第14章 堆与拷贝构造函数第14章 堆与拷贝构造函数vc+中,堆分配的概念得到了扩展,不仅c+的关键字new和delete可以分配和释放堆空间,而且通过new建立的对象要调用构造函数,通过delete删除对象也要用析构函数.14.1 关于堆vC+程序的内存格局通常分为四个

2、区:v (1)全局数据区;(2)代码区;(3)栈区;(4)堆区自由存储区)v全局变量、静态数据、常量存放在全局数据区,所有类成员函数和非成员函数代码存放在代码区,为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区,余下的空间都被作为堆区。v函数“ void *malloc(size_t);”和“void free(void *)”;在头文件malloc.h中声明,而操作符new和delete是c+语言的一部分,无须包含头文件。v操作堆内存时,如果分配了内存,应有责任回收它,否则运行的程序将会造成内存泄漏.14.2 需要new和delete的原因v从c+的立场上看,不能用mal

3、loc()函数的一个原因是,它在分配空间的时候不能调用构造函数。类对象的建立是分配空间、构造结构以及初始化的三位一体,它们统一由构造函数来完成。v从程序设计的需要来看,在分配内存申请的时候,总是知道分配的空间派什么用,而且分配空间大小总是某个数据类型包括类类型的整数倍。因而c+用new 代替c的malloc.14.3 分配堆对象v堆对象的作用域是整个程序生命期,所以除非程序运行完毕,否则堆对象作用域不会到期。v从堆上分配对象数组,只能调用默认的构造函数,不能调用其他任何构造函数。如果该类没有默认构造函数,则不能分配对象数组。v一般来说,堆空间相对其他内存空间比较空闲,随要随拿,给程序运行带来了

4、较大的自由度。使用堆空间往往由于:v (1)直到运行时才能知道需要多少对象空间;v (2)不知道对象的生存期到底有多长;v (3)直到运行时才知道一个对象需要多少内存空间。14.4 拷贝构造函数v可用一个对象去构造另一个对象,或者说,用另一个对象值初始化一个新构造的对象。v对象作为函数参数时,也要涉及对象的拷贝。v对象的类型多种多样,有些对象还可申请系统资源。 S 对象下面的程序介绍了拷贝构造函数的用法。例:1.cpp14.5 默认拷贝构造函数v类定义中,如果未提供自己的拷贝构造函数,则c+提供一个默认的拷贝构造函数。vC+提供的默认拷贝构造函数工作的方法是,完成一个成员一个成员的拷贝。如果成

5、员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数。v 例如,下面的程序中Totor类使用了默认拷贝构造函数:v 例2.cpp14.6 浅拷贝与深拷贝v在默认拷贝构造函数中,拷贝的策略是逐个成员依次拷贝。但是拷贝构造函数简单地制作了一个该 资源的拷贝,而不对它本身分配,就面临一个麻烦的局面:两个对象都有同一个资源。当对象析构时,该资源将经历两次资源返还。v浅拷贝:创建p2时,对象p1被复制给了p2,但资源并未复制,p1和p2指向同一个资源。例3v深拷贝:创建p2时,对象p1被复制给了p2,同时资源也作了复制,p1和p2指向不同的资源。例4v堆内存不是唯一需要拷贝构造函数的资源,但它是最常用的

6、一个。v阅历:如果你的类需要析构函数来析构资源,则它也需要一个拷贝构造函数。14.7 临时对象v当函数返回一个对象时,要创建一个临时对象以存放到返回的对象。v一般规定,创建的临时对象,在整个创建它们的外部表达式范围内有效,否则无效。14.8 无名对象l可以直接调用构造函数产生无名对象。l无名对象可以作为实参传递给函数,可以拿来拷贝构造一个新对象,也可以初始化一个引用的声明。l无名对象的三种典型用法:l初始化引用。如:Student& refs=Student(“Randy”);l初始化对象定义。如:Student s=Student(“Jenny”);l函数参数。如:fn(Studen

7、t(“Danny”);14.9 构造函数用于类型转换vC+中5/8与5.0/8结果不同,因为执行了两种不同的操作。 5.0/8匹配了两个double类型数的除法, C+知道如何将8转换成 double型,这是基本数据类型的转换。但是,转换用户定义的类类型,必须由用户告知。用户告知的方式是定义一个参数的构造函数。v把构造用来从一种类型转换为另一种类型,这是c+从类机制中获得的附加性能。要注意两点:v (1)只会尝试含有一个参数的构造函数;v (2)如果有二义性,则放弃尝试。 14章小结v运算符new分配堆内存,如果成功,则返回指向该内存的空间,如果失败,则返回null。所以每次使用运算符new动态分配内存时,都应测试new的返回指针值,以防分配失败。v堆空间的大小是有限的,视其操作系统和编译设置的不同而不同。当程序不再使用所分配的堆空间时,应及时用delete释放它们。v由c+提供的默认拷贝构造函数只是对对象进行拷贝复制。如果对象的数据成员包括指向堆空间的指针,就不能使用这种拷贝方式,此时必须自定义拷贝构造函数,为创建的对象分配堆空间。、理论作业做在作业本上上交)

温馨提示

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

评论

0/150

提交评论