- 1、本文档共27页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
几乎所有的类都有一个或多个构造函数,一个析构函数和一个赋值操作符。这没什么奇怪的,因为它们提供的都是一些最基本的功能。构造函数控制对象生成时的基本操作,并保证对象被初始化;析构函数摧毁一个对象并保证它被彻底清除;赋值操作符则给对象一个新的值。在这些函数上出错就会给整个类带来无尽的负面影响,所以一定要保证其正确性。本章我将指导如何用这些函数来搭建一个结构良好的类的主干。构造函数,析构函数和赋值操作符几乎所有的类都有一个或多个构造函数,一个析构函数和一个赋值操作符。这没什么奇怪的,因为它们提供的都是一些最基本的功能。构造函数控制对象生成时的基本操作,并保证对象被初始化;析构函数摧毁一个对象并保证它被彻底清除;赋值操作符则给对象一个新的值。在这些函数上出错就会给整个类带来无尽的负面影响,所以一定要保证其正确性。本章我将指导如何用这些函数来搭建一个结构良好的类的主干。条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符看下面一个表示string对象的类:// 一个很简单的string类class string {public: string(const char *value); ~string(); ...?????????????????????????? // 没有拷贝构造函数和operator=private: char *data;};string::string(const char *value){ if (value) { data = new char[strlen(value) + 1]; strcpy(data, value); } else { data = new char[1]; *data = \0; }}inline string::~string() { delete [] data; }请注意这个类里没有声明赋值操作符和拷贝构造函数。这会带来一些不良后果。如果这样定义两个对象:string a(hello);string b(world);其结果就会如下所示:a:? data—— hello\0b:? data—— world\0对象a的内部是一个指向包含字符串hello的内存的指针,对象b的内部是一个指向包含字符串world的内存的指针。如果进行下面的赋值:b = a;因为没有自定义的operator=可以调用,c++会生成并调用一个缺省的operator=操作符(见条款45)。这个缺省的赋值操作符会执行从a的成员到b的成员的逐个成员的赋值操作,对指针(a.data和b.data) 来说就是逐位拷贝。赋值的结果如下所示:a:? data -------- hello\0 /b:? data --/?????? world\0这种情况下至少有两个问题。第一,b曾指向的内存永远不会被删除,因而会永远丢失。这是产生内存泄漏的典型例子。第二,现在a和b包含的指针指向同一个字符串,那么只要其中一个离开了它的生存空间,其析构函数就会删除掉另一个指针还指向的那块内存。string a(hello);???????????????? // 定义并构造 a{????????????????????????????????? // 开一个新的生存空间 string b(world);?????????????? // 定义并构造 b ... b = a;?????????????????????????? // 执行 operator=, // 丢失b的内存}????????????????????????????????? // 离开生存空间, 调用 // b的析构函数string c = a;????????????????????? // c.data 的值不能确定! // a.data 已被删除例子中最后一个语句调用了拷贝构造函数,因为它也没有在类中定义,c++以与处理赋值操作符一样的方式生成一个拷贝构造函数并执行相同的动作:对对象里的指针进行逐位拷贝。这会导致同样的问题,但不用担心内存泄漏,因为被初始化的对象还不能指向任何的内存。比如上面代码中的情形,当c.data用a.data的值来初始化时没有内存泄漏,因为c.data没指向任何地方。不过,假如c被a初始化后,c.data和a.data指向同一个地方,那这个地方会被删除两次:一次在c被摧毁时,另一次在a被摧毁时。拷贝构造函数的情况和赋值操作符还有点不同。在传值调用的时候,它会产生问题。当然正如条款22所说明的,一般很少对对象进行传值调用,但还是看看下面的例子:void donothing(string localstring) {}string s = the truth is out there;donothing(s);一切好象都
您可能关注的文档
最近下载
- 内蒙古鄂尔多斯准格尔经济开发区(大路产业园)区域性地震安全性评价报告.docx VIP
- 部编版六年级语文上册《夏天里的成长》课件.pptx
- 山西省2020年中考数学试题(Word版,含答案与解析).pdf VIP
- 长沙市雅礼中学2023-2024学年高二上学期期中考试物理试题及参考答案.pdf VIP
- 精品解析:山东省菏泽市2023-2024学年高二上学期11月期中化学试题(解析版).docx VIP
- 离婚协议书标准版下载[汇编].pdf
- 2023年山东省青岛西海岸新区自然资源局遴选劳务派遣人员69人笔试参考题库(共500题)答案详解版.docx
- 消融电极产品技术要求模板.docx
- YBT 6016-2022球墨铸铁管绿色工厂评价要求.pdf
- “双减”背景下家校共育的问题及策略.doc
文档评论(0)