2-4 拷贝构造函数_第1页
2-4 拷贝构造函数_第2页
2-4 拷贝构造函数_第3页
2-4 拷贝构造函数_第4页
2-4 拷贝构造函数_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

拷贝构造函数若一个构造函数的参数类型为本类的引用,则称它为拷贝构造函数。例如: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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论