版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
拷贝构造函数若一个构造函数的参数类型为本类的引用,则称它为拷贝构造函数。例如: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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年山西退役士兵单招技能测试零基础专用题库含答案
- 2026年陕西单招英语高频词配套语法填空翻译题库含答案
- 2026年广西单招技能拔尖考生综合素质测试题含答案免考资格适配
- 2026年安徽体育单招考生文化提分题库含答案基础题占比70%
- 2026年河北单招技能拔尖考生综合素质测试题库含答案
- 2026年厦门单招装备制造大类普高生职业适应性题库含答案
- 2026年内蒙古单招学前教育专业技能模拟题含答案音乐美术舞蹈三选一
- 2026年黑龙江单招财经商贸类考前10天冲刺卷含答案
- 2026年厦门单招新能源汽车技术专业故障诊断经典题含答案智能网联方向
- 2025国有企业话务员招聘(2人)笔试备考题库及答案解析
- 混合型高脂血症基层诊疗中国专家共识2024解读
- DL-T5842-2021110kV~750kV架空输电线路铁塔基础施工工艺导则
- 庙坝镇规划方案公示
- 叉车考试题库
- 《机修工基础培训》课件
- 口腔正畸学课件
- 一次调频综合指标计算及考核度量方法
- 《杀死一只知更鸟》读书分享PPT
- 成功的三大要素
- GB/T 41932-2022塑料断裂韧性(GIC和KIC)的测定线弹性断裂力学(LEFM)法
- GB/T 7253-2019标称电压高于1 000 V的架空线路绝缘子交流系统用瓷或玻璃绝缘子元件盘形悬式绝缘子元件的特性
评论
0/150
提交评论