类的构造函数和赋值的区别.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文档。上传文档
查看更多
拷贝构造函数和赋值函数的异同 由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数 有些轻视。请先记住以下的警告,在阅读正文时就会多心:   ?? 如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”   的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐   含了错误。以类String 的两个对象a,b 为例,假设a.m_data 的内容为“hello”,   b.m_data 的内容为“world”。   现将a 赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data = a.m_data。   这将造成三个错误:一是b.m_data 原有的内存没被释放,造成内存泄露;二是   b.m_data 和a.m_data 指向同一块内存,a 或b 任何一方变动都会影响另一方;三   是在对象被析构时,m_data 被释放了两次。    class A {} A a; A b = a;//拷贝构造函数; A c; c = a; //赋值函数; 所以写赋值函数时顺便写拷贝构造函数. A a; A b; b = (A)a; 先copy构造一个,然后用赋值赋给b 拷贝构造函数和赋值函数非常容易混淆,常导致错写、错用。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用。以下程序中,第三个语句和第四个语句很相似,你分得清楚哪个调用了拷贝构造函数,哪个调用了赋值函数吗?   String a(“hello”);   String b(“world”);   String c = a; // 调用了拷贝构造函数,最好写成 c(a);   c = b; // 调用了赋值函数   本例中第三个语句的风格较差,宜改写成String c(a) 以区别于第四个语句。   类String 的拷贝构造函数与赋值函数   // 拷贝构造函数   String::String(const String other)   {   // 允许操作other 的私有成员m_data   int length = strlen(other.m_data);   m_data = new char[length+1];   strcpy(m_data, other.m_data);   }   // 赋值函数   String String::operate =(const String other)   {   // (1) 检查自赋值   if(this == other)   return *this;   // (2) 释放原有的内存资源   delete [] m_data;   // (3)分配新的内存资源,并复制内容   int length = strlen(other.m_data);   m_data = new char[length+1];   strcpy(m_data, other.m_data);   // (4)返回本对象的引用   return *this;   }   类String 拷贝构造函数与普通构造函数的区别是:在函数入口处无   需与NULL 进行比较,这是因为“引用”不可能是NULL,而“指针”可以为NULL。   类String 的赋值函数比构造函数复杂得多,分四步实现:   (1)第一步,检查自赋值。你可能会认为多此一举,难道有人会愚蠢到写出 a = a 这   样的自赋值语句!的确不会。但是间接的自赋值仍有可能出现,例如   // 内容自赋值   b = a;   …   c = b;   …   a = c;   // 地址自赋值   b = a;   …   a = *b;   也许有人会说:“即使出现自赋值,我也可以不理睬,大不了化点时间让对象复制   自己而已,反正不会出错!”   他真的说错了。看看第二步的delete,自杀后还能复制自己吗?所以,如果发现自   赋值,应该马上终止函数。注意不要将检查自赋值的if 语句   if(this == other)   错写成为   if( *this == other)   (2)第二步,用delete 释放原有的内存资源。如果现在不释放,以后就没机会了,将   造成内存泄露。   (3)第三步,分配新的内存资源,并复制字符串。注意函数strlen 返回的是有效字符   串长度,不包含结束符‘\0’。函数strcpy 则连‘\0’一起复制。   (4)第四步,返回本对象的引用,目的是为了实现象 a = b = c 这样的链式表达。注   意不要将 return *this 错写成 return this 。那么能否写成return other 呢?效果   不是一样吗?

文档评论(0)

mhk8089 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档