博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第九章:重载赋值运算符中需要注意的两个问题
阅读量:6783 次
发布时间:2019-06-26

本文共 1249 字,大约阅读时间需要 4 分钟。

前言

       如果系统自动生成的赋值运算符重载函数不合乎你的要求,那么就应当定制自己的赋值运算符。

       然而,定制赋值运算符有两点是非常值得注意的,本文将讲解这两点,让你写出更优质的 =运算符。

第一点:请返回 reference to *this

       我们经常使用如 "a=b=c=1" 这种形式的连锁赋值语句,而重载的赋值运算符自然也应当能够这样使用。

       因此,在重载运算符函数末尾请写上如这样的语句 return *this;

       除了赋值运算符,+=,-=这样的赋值运算符同样需要这样做。

第二点:处理好自我赋值

       首先,我们看一段问题代码:

1 // 位图资源类 2 class Bitmap { /*......*/ }; 3  4 // 位图资源管理类 5 class Widget { 6 public: 7     //...... 8     Widget & operator=(const Widget & rhs); 9     //......10 private:11     //......12     Bitmap *pb;    // 位图资源。指针类型,指向 heap 分配而得的空间13     //......14 };15 16 Widget & Widget::operator=(const Widget & rhs)17 {18     delete pb;    // 删除原有资源19     pb = new Bitmap(*rhs.pb);    // 申请新的资源并存放右操作数的数据20     return *this;21 }

       问题出在重载函数中,如果左右操作数是相同的对象,delete 掉原有资源之后,所有数据信息就全丢了。

       因此,运算符重载函数需要加上一个证同测试:

1 Widget & Widget::operator=(const Widget & rhs) 2 { 3     // 加入证同测试 4     if (this == &rhs) 5         return *this; 6  7     delete pb;    // 删除原有资源 8     pb = new Bitmap(*rhs.pb);    // 申请新的资源 9 10     return *this;11 }

       但这依然不是最好的做法:因为 new 有可能失败,导致资源丢失。

       下面这个精心设计的重载函数才是我们需要的:

1 Widget & Widget::operator=(const Widget & rhs)2 {3     Bitmap * pOrig = pb;4     pb = new Bitmap(*rhs.pb);5     delete pOrig;6 7     return *this;8 }

       这个实现就保证了赋值的安全,健壮,是个非常可取的方案。

小结

       赋值运算符还有一些其他的非常可取的实现,这里就不一一讲解了。

转载地址:http://yxwgo.baihongyu.com/

你可能感兴趣的文章
你以为AlphaGo只是下围棋厉害?不,它还能用来优化金融交易策略参数
查看>>
Spark on YARN 部署案例
查看>>
微服务网关Kong 1.0正式发布!提供100+项功能
查看>>
Amazon Aurora是如何设计原生云关系型数据库的?
查看>>
2019数据库趋势报告,最受欢迎的是MySQL
查看>>
7道常见的数据分析面试题
查看>>
专访Martijn Verburg,关于AdoptOpenJDK与Nestmates
查看>>
2019年全球品牌500强出炉:科技企业承包前7名,华为排12
查看>>
Yarn将用TypeScript重写,Flow惨遭亲爹抛弃!
查看>>
RedHat发布JBoss 7.2,完全支持Java EE 8规范
查看>>
90 后 CTO 创业 6 年,做了一件改变互联网的“小事”
查看>>
2019年,全栈开发者应该学些什么?
查看>>
Node.js v7 Beta版引入citgm
查看>>
\"Grokking Algorithms\"简介与作者采访
查看>>
ESLint的NPM账户遭黑客攻击,可能窃取用户NPM访问令牌
查看>>
何时该用无服务器,何时该用Kubernetes?
查看>>
MySQL - 慢查询
查看>>
Facebook新推出AL语言,意在简化程序静态分析
查看>>
下一代微服务!Service Mesh 2018年度总结
查看>>
数据建模NoSQL数据库的概念和对象建模符号
查看>>