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

C++拷贝构造函数和赋值操作.docx

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

赋值运算符和复制构造函数都是用已存在的B对象来创建另一个对象A。不同之处在于:赋值运算符处理两个已有对象,即赋值前B应该是存在的;复制构造函数是生成一个全新的对象,即调用复制构造函数之前A不存在。CTemp a(b); //复制构造函数,C++风格的初始化CTemp a=b; //仍然是复制构造函数,不过这种风格只是为了与C兼容,与上面的效果一样在这之前a不存在,或者说还未构造好。CTemp a; a=b; //赋值运算符在这之前a已经通过默认构造函数构造完成。实例总结:重点:包含动态分配成员的类应提供拷贝构造函数,并重载=赋值操作符。以下讨论中将用到的例子:class CExample { public: CExample(){pBuffer=NULL; nSize=0;} ~CExample(){delete pBuffer;} void Init(int n){ pBuffer=new char[n]; nSize=n;} private: char *pBuffer; //类的对象中包含指针,指向动态分配的内存资源int nSize; };这个类的主要特点是包含指向其他资源的指针。pBuffer指向堆中分配的一段内存空间。一、拷贝构造函数调用拷贝构造函数1int main(int argc, char* argv[]) { CExample theObjone; theObjone.Init(40);//现在需要另一个对象,需要将他初始化称对象一的状态CExample theObjtwo=theObjone;//拷贝构造函数... } 语句CExample theObjtwo=theObjone;用theObjone初始化theObjtwo。其完成方式是内存拷贝,复制所有成员的值。完成后,theObjtwo.pBuffer==theObjone.pBuffer。即它们将指向同样的地方(地址空间),指针虽然复制了,但所指向的空间内容并没有复制,而是由两个对象共用了。这样不符合要求,对象之间不独立了,并为空间的删除带来隐患。所以需要采用必要的手段来避免此类情况。回顾以下此语句的具体过程:通过拷贝构造函数(系统默认的)创建新对象theObjtwo,并没有调用theObjtwo的构造函数(vs2005试验过)。可以在自定义的拷贝构造函数中添加输出的语句测试。注意:对于含有在自由空间分配的成员时,要使用深度复制,不应使用浅复制。调用拷贝构造函数2当对象直接作为参数传给函数时,函数将建立对象的临时拷贝,这个拷贝过程也将调同拷贝构造函数。例如BOOL testfunc(CExample obj);testfunc(theObjone); //对象直接作为参数。BOOL testfunc(CExample obj) { //针对obj的操作实际上是针对复制后的临时拷贝进行的}调用拷贝构造函数3当函数中的局部对象被被返回给函数调者时,也将建立此局部对象的一个临时拷贝,拷贝构造函数也将被调用CTest func() { CTest theTest; return theTest }二、赋值符的重载下面的代码与上例相似int main(int argc, char* argv[]) { CExample theObjone; theObjone.Init(40);CExample theObjthree; theObjthree.Init(60);//现在需要一个对象赋值操作,被赋值对象的原内容被清除,并用右边对象的内容填充。theObjthree=theObjone; return 0; }也用到了=号,但与一、中的例子并不同,一、的例子中,=在对象声明语句中,表示初始化。更多时候,这种初始化也可用括号表示。例如 CExample theObjone(theObjtwo);而本例子中,=表示赋值操作。将对象theObjone的内容复制到对象theObjthree;,这其中涉及到对象theObjthree原有内容的丢弃,新内容的复制。但=的缺省操作只是将成员变量的值相应复制。旧的值被自然丢弃。由于对象内包含指针,将造成不良后果:为了避免内存泄露,指针成员将释放指针所指向的空间,以便接受新的指针值,这正是由赋值运算符的特征所决定的。但如果是x=x即自己给自己赋值,会出现什么情况呢?x将释放分配给自己的内存,然后,从赋值运算符右边指向的内存中复制值时,发现值不见了。因此,包含动态分配成员的类除提供拷贝构造函数外,还应该考虑重载=赋值操作符号。类定义变为:class CExample { ... CExample(const CExample); //拷贝构造函数CExample operator = (const CExample); //赋值

文档评论(0)

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

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

1亿VIP精品文档

相关文档