网站大量收购闲置独家精品文档,联系QQ:2885784924

钱能第14章 堆与拷贝构造函数.ppt

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
钱能第14章 堆与拷贝构造函数

第14章 堆与拷贝构造函数 14.1 关于堆 14.2 需要new和delete的原因 14.3 分配堆对象 14.4 拷贝构造函数 14.5 默认拷贝构造函数 14.6 浅拷贝与深拷贝 14.7 临时对象 14.8 无名对象 14.9 构造函数用于类型转换 14.1 关于堆 C++程序的内存格局通常分为四个区: (1)全局数据区(data area): 全局变量、静态数据、常量存放在全局数据区。 (2)代码区(code area) : 所有类成员函数和非成员函数代码存放在代码区。 (3)栈区(stack area): 为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区。 (4)堆区(即自由存储区)(heap area): 其余的空间都是堆区。 14.2 需要new和delete的原因 分配内存空间、撤销内存空间 C的用法: #include malloc.h void* malloc(size_t); void free(void*); C++的用法: new delete 从C++的立场来看,不能用malloc()函数的一个原因是,它在分配空间的时候不能调用构造函数。类对象的建立是分配空间、构造结构以及初始化的三位一体,它们统一由构造函数来完成。 例如:用malloc()进行对象的创建过程。 14.3 分配堆对象 C++的new和delete的用法: new带参数的形式 例如,下面的代码分配了参数给定的对象个数,并在函数结束时,予以返还。 从堆上分配对象数组,只能调用默认的构造函数,不能调用其它任何构造函数。如果该类没有默认构造函数,则不能分配对象数组。 14.4 拷贝构造函数 可用一个对象去构造另一个对象,或者说,用另一个对象值初始化一个新构造的对象,例如: Student s1(“Jenny”); Student s2 = s1; //用s1的值初始化s2 对象作为函数参数传递时,也涉及对象的拷贝,例如: 拷贝构造函数的用法 例ch14_1.cpp P317 续 运行结果: 14.5 默认拷贝构造函数 类定义中,如果未提供自己的拷贝构造函数,则C++提供一个默认拷贝构造函数,就像没有提供构造函数时,C++提供默认构造函数一样。 C++提供默认的拷贝构造函数工作的方法是,完成一个成员一个成员的拷贝。如果成员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数。 例如,下面的程序中Tutor类使用了默认拷贝构造函数。ch14_2.cpp 续 续 运行结果: 14.6 浅拷贝与深拷贝 浅拷贝 创建p2时,对象p1被复制给了p2,但资源并未复制,因此,p1和p2指向同一个资源,这称为浅拷贝。 深拷贝 当一个对象创建时,分配了资源,这时,就需要定义自己的拷贝构造函数,使之不但拷贝成员,也分配和拷贝资源。 例ch14_3.cpp P320 例ch14_4.cpp P321 续 运行结果: 14.7 临时对象 当函数返回一个对象时,要创建一个临时对象以存放返回的对象。 例如,下面的代码中,返回的ms对象将产生一个临时对象: 14.8 无名对象 可以直接调用构造函数产生无名对象。 例如,下面的代码在函数fn()中,创建了一个无名对象: 无名对象可以作为实参传递给函数,可以用来拷贝构造一个新对象,也可以初始化一个引用的声明。 例如,下面的代码表达了无名对象典型的三种用法: 14.9 构造函数用于类型转换 例如,下面的代码定义了学生类的构造函数: 把构造函数用来从一种类型转换为另一种类型,这是C++从类机制中获得的附加功能。但要注意两点: (1)只会尝试含有一个参数的构造函数; (2)如果有二义性,则放弃尝试。 + + 程序设计 第 14 章 堆与拷贝构造函数 C * 在这里,系统调用拷贝构造函数ms拷贝到新创建的临时对象中。 这里Student(char *)构造函数同时也在告知,如何将char*转换成一个Student对象。 + + 程序设计 第 14 章 堆与拷贝构造函数 C * *

您可能关注的文档

文档评论(0)

2266670 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档