- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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 呢?效果 不是一样吗?
您可能关注的文档
最近下载
- 人工挖孔桩有限空间作业专项施工方案-2024.docx
- 2025年社区工作者公共基础知识与社区工作相关知识试卷.docx VIP
- 2025-2026年中国机械加工行业发展现状分析报告(目录) .pdf VIP
- 《GMP物料管理培训》课件.ppt VIP
- 2016款上汽名爵MG3_汽车使用手册用户操作图解驾驶指南车主车辆说明书电子版.pdf VIP
- 1000 Basic English Words—1000核心单词全4册单词带音标.pdf VIP
- 2025年社区工作者招聘考试公共基础知识(社区工作相关知识)题库.docx VIP
- 急性肺水肿患者应急预案及流程.pptx VIP
- 2025年社区工作者招聘考试(公共基础知识+社区工作相关知识)题库.docx VIP
- 智能控制技术专业人才培养方案(高职).pdf VIP
原创力文档


文档评论(0)