版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
拷贝构造函数若一个构造函数的参数类型为本类的引用,则称它为拷贝构造函数。例如:classA{ ...... public: A();//默认构造函数
A(constA&a);//拷贝构造函数};
在创建一个对象时,若用另一个同类型的对象对其初始化,将会调用对象类中的拷贝构造函数。在三种情况下,会调用类的拷贝构造函数:创建对象时显式指出。例如:Aa1;Aa2(a1);//创建对象a2,用对象a1初始化对象a2把对象作为值参数传给函数时。例如:voidf(Ax){......};......Aa;f(a);//创建形参对象x,用对象a对x进行初始化。把对象作为函数的返回值时。例如:Af(){ Aa; ...... returna;//创建返回值对象,用对象a对返回值对象
//进行初始化。}隐式拷贝构造函数在程序中,如果没有为某个类提供拷贝构造函数,则编译器将会为其生成一个隐式拷贝构造函数。隐式拷贝构造函数将逐个成员进行拷贝初始化对于非对象成员:它采用通常的拷贝操作;对于成员对象:则调用成员对象类的拷贝构造函数来对成员对象进行初始化。(递归定义!)classA{ intx,y; public: A(){x=y=0;} ......};classB{ intz; Aa;public: B(){z=0;} ......//其中没有定义拷贝构造函数};...Bb1;//b1.z以及b1.a.x和b1.a.y均为0。Bb2(b1);//b2.z初始化成b1.z(0);
//调用A的拷贝构造函数用b1.a对b2.a初始化自定义拷贝构造函数一般情况下,编译程序提供的隐式拷贝构造函数的行为足以满足要求,类中不需要自定义拷贝构造函数。但在一些特殊情况下,必须要自定义拷贝构造函数,否则,将会产生设计者未意识到的严重的程序错误。例如,在下面的类中没有自定义拷贝构造函数:classString{ intlen; char*str; public: String(char*s) {len=strlen(s); str=newchar[len+1]; strcpy(str,s); } ~String(){delete[]str;len=0;str=NULL;}};......Strings1("abcd");Strings2(s1);lenstrlenstrs1s2abcd44隐式的拷贝构造函数将会使得s1和s2的
成员指针str指向同一块内存区域!它带来的问题是:如果对一个对象(s1或s2)操作之后修改了这块空间的内容,则另一个对象将会受到影响。如果不是设计者特意所为,这将是一个隐藏的错误。当对象s1和s2消亡时,将会分别去调用它们的析构函数,这会使得同一块内存区域将被归还两次,从而导致程序运行错误。当对象s1和s2中有一个消亡,另一个还没消亡时,则会出现使用已被归还的空间问题!系统提供的隐式拷贝构造函数实施的是浅拷贝(shallowcopy):只拷贝数据成员本身的值。为了解决上面的问题,可以在类String中显式定义一个拷贝构造函数来实现深拷贝(deepcopy)String::String(constString&s){ len=s.len;
str=newchar[len+1]; strcpy(str,s.str);}lenstrlenstrs1s2abcd44abcdAs2(s1);注意:自定义的拷贝构造函数默认调用的是成员对象类的默认构造函数来对成员对象初始化!classA{ intx,y; public: A(){x=y=0;} voidinc(){x++;y++;}};classB{intz; Aa;public: B(){z=0;} B(constB&b){z=b.z;} voidinc(){z++;a.inc();}};...Bb1;/b1.z、b1.a.x和b1.a.y均为0b1.inc();//b1.z、b1.a.x和b1.a.y均变成了1Bb2(b1);//b2.z为1,b2.a.x和b2.a.y均为0如何能让b2.a与b1.a保持一致呢?在B类的拷贝构造函数的成员初始化表中显式指出!:a(b.a)b2.a.x和b2.a.y均为1下面对b2.a进行赋值初始化与拷贝构造的区别是什么?classA{......};classB{intz;
Aa;
public:
B(){......}B(constB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学高中语文 第7课诗三首试题 新人教版必修2
- 中国智能无人机行业市场集中度、企业竞争格局分析报告-智研咨询发布
- 中国汽车零配件检测行业发展策略、市场环境及前景研究分析报告(智研咨询)
- 中国镁行业投资分析、市场运行态势研究报告-智研咨询发布(2024版)
- 产业研究报告-中国地质勘察行业发展现状、市场规模、投资前景分析(智研咨询)
- 医疗废物管理工作计划(合集4篇)
- 学生低碳生活演讲稿600字5篇
- 2024年纳米漆项目发展计划
- 2025届江苏省无锡市北塘区数学三上期末监测模拟试题含解析
- 个人员工工作总结大全10篇
- DB37-T 4149-2020 水质 UV254的测定 紫外分光光度法
- 产教融合实训基地建设与管理办法
- 风机招标技术要求
- 教育教学常规讲座课件
- 虾青素研究报告资料
- 加油站隐患排查治理制度
- 选修课《中国茶文化》全套教案
- 风电场机组强制性条文
- 六年级数学上册课件-5.1 圆的认识-人教版(共15张PPT)
- 公司定额管理办法
- 集团财务一体化方案
评论
0/150
提交评论