浅析C中拷贝构造函数使用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅析C中拷贝构造函数使用

浅析C中拷贝构造函数使用   [摘要]对拷贝构造函数的使用作了浅析,还针对浅拷贝会引起的问题进行了分析,并由此引出对深拷贝的重要性的描述。   [关键词]拷贝构造函数 浅拷贝 深拷贝   中图分类号:TP3 文献标识码:B 文章编号:1002-6908(2007)0720058-02      学习过C++后才能真正体会到C++语言其实并不是C语言的简单扩充而已,扩充这部分的核心是面向对象程序设计思想,而面向对象的程序设计思想是从介绍类与对象开始的。   除了保留C中定义的构造类型(如struct、union、enum)以外,C++中增加了一个构造类型就是类(class),与之前的构造类型相比,它的特点在于除了包含数据成员,class中还可定义对数据成员的操作函数。在面向对象程序设计中,构造函数和拷贝构造函数是两个非常重要的函数。拷贝构造函数是特殊的构造函数,但在使用过程中两者存在着很大的区别。本文对拷贝构造函数的使用作了解析。      一、拷贝构造函数的概念      若构造函数的参数是针对同类对象的引用时,称之为拷贝构造函数或复制构造函数。由于拷贝构造函数的参数是针对同类对象的引用,所以拷贝构造函数的功能是用一个已经存在的对象去构造并初始化另一个新建的对象,它既要构造一个新对象,又要把已有对象的相关内容赋给新对象,是一个特殊的构造函数,该函数的函数名与构造函数名相同,并且也没有返回值。其定义格式如下:   类名:: 类名( 类名 引用类 )      二、浅拷贝      如果以拷贝构造函数的生成方式对拷贝构造函数进行分类,可分为默认拷贝构造函数和自定义拷贝构造函数。   若一个类中没有定义拷贝构造函数,则系统为该类定义一个默认的拷贝构造函数。如假定类X中没有定义拷贝构造函数,则系统为类X定义的默认拷贝构造函数为:      系统默认的拷贝构造函数把参数对象的值赋给被初始化的对象中,也就是说,把参数对象中的内容逐节地原原本本地拷贝到被初始化对象的对应字节中,使得被初始化对象的每个成员值与初始化对象的每个成员值完全相同。这种拷贝方式是浅拷贝。   通常情况下的简单对象,不使用额外系统资源,则默认拷贝构造函数就能够胜任工作。但有些对象要使用系统资源,浅拷贝会引起如下错误:   ①两个对象共同拥有同一资源,资源的归属权不清;   ②若一个对象将资源返还给系统,另一对象则无法再次使用该资源,这不仅会引起资源管理的混乱也会影响应用程序的运行;   ③当对象析构时,该资源将经历两次资源返还。   例如有的类的数据成员中存在着指针,且该指针指向动态分配的存储空间。对于这样的类,采用系统默认的拷贝构造函数用参数对象对当前对象进行初始化后,这两个对象的相应指针将指向同一块动态分配的存储空间;当一个对象由于某种原因用delete操作将这块存储空间释放给系统之后,另一个对象中的相应指针仍指向这个已被释放掉的存储空间,而通过它再访问这块存储空间将是无效和非法的。例如:有类Array定义为   class Array{//定义数组类   int *a; //定义数组指针,用以指向一个动态数组空间   int n; //定义数组长度   public:   Array(){a=NULL;n=0;}//构造空数组   Array(int aa[],int len) //数组aa提供初始化数据   {   n=len; //给n赋初值为len   a=new int[n]; //建立动态数组   for(int i=0;in;i++)   a[i]=aa[i]; //把aa的每个元素值赋给a数组对应元素中   }   };   执行   int a[]={54,23,45,67,87,65};   Arrayr1(a,6),r2(r1);   后,由于r2是调用默认的拷贝构造函数建立的,因此与r1共享动态数组空间,如下图所示:      三、深拷贝      为了避免这种情况的发生,就需要用户定义自己的拷贝构造函数,在这个函数中,作为数据成员的指针须指向一块特别申请的动态空间,它的大小和其中的内容应与参数对象中的相应指针所指向的空间完全相同。这样,两个对象中相应指针成员就各自指向了不同的动态存储空间,一个对象中存储空间的释放绝不会影响另一个对象中相应的动态存储空间的存在。   对于上述定义的Array类,应为它提供的拷贝构造函数如下:   Array::Array(Array x)   {    n=x.n; //将x中n成员的值赋给*this中的n成员    a=new int[n]; //申请一块能容纳n个整数单元的数组空间    //把x.a数组

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档