博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
effective c++条款11 在operator=中处理“自我赋值”
阅读量:5058 次
发布时间:2019-06-12

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

在实现operator=时考虑自我赋值是必要的就像 x=y ,我们不知道变量x与y代表的值是否为同一个值(把x和y说成是一个指针更恰当一点)。如下

class bitmap{};class Widget{public:    Widget& operator=(const Widget& rhn);private:    bitmap *pb; //定义一个指针指向对分配的空间}

第一版赋值函数:

Widget& Widget::operator=(const Widget& rhs){    delete pb;    pb = new bitmap(*rhs.pb);    return this;}

这般函数的pb在使用前清理掉之前的pb指向,在接受一个new出来的新对象,看着很顺理成章,但当 this 与函数的参数rhs相等时pb = new bitmap(*rhs.pb);会执行出错,因为我们已经把*rhs.pb delete了。

第二版赋值函数:

Widget& Widget::operator=(const Widget& rhs){    if(*this == rhs) return *this;    delete pb;    pb = new bitmap(*rhs.pb)    return *this;}

这个版本的赋值函数基本上是可以接受的,但不见的是安全的,因为当new产生异常时pb依然是个不确定的指针。

第三个版本:

idget& Widget::operator=(const Widget& rhn){    bitmap *pOrig = pb;    pb = new bitmap(*rhn.pb);    delete pOrig;    return this;}

 这个函数在开始时用pOrig记录了pb,当new没有异常时我们在把Pb原来的指向空间释放掉,从而提高了安全性。

实现赋值函数还有另外一个思想,即copy and swap技术

class Widget {void swap(const Widget& rhs);}Widget& Widget::operator=(const Widget& rhs)    {    Widget temp(rhs);  //防止改变rhs    swap(temp);    return *this;}

当然我们也可以by value 传递参数

Widget& Widget::operator=(const Widget rhs) //按值传递是实参的一个copy   {    swap(temp);    return *this;}

copy and swap技术的缺点是巧妙的运用swap丧失了代码的清晰性,然而将“copy动作”移动到函数参数的构造阶段令编译器有时生成高效的代码..

 

 

 

转载于:https://www.cnblogs.com/onlycxue/archive/2013/05/09/3070222.html

你可能感兴趣的文章
虚拟中没有eth0
查看>>
Unity 3D游戏开发学习路线(方法篇)
查看>>
BZOJ2049[Sdoi2008]Cave 洞穴勘测(LCT模板)
查看>>
vuex插件
查看>>
网络__笔记_TCP/IP详解___第一章
查看>>
屏幕绘图最佳利器Pointfix,绿色中文版
查看>>
2011年12月09日
查看>>
[ZJOI2007]棋盘制作 【最大同色矩形】
查看>>
合并单元格
查看>>
swift-初探webView与JS交互
查看>>
IOS-图片操作集合
查看>>
Android bitmap图片处理
查看>>
Android应用程序进程启动过程的源代码分析
查看>>
adb logcat 命令行用法
查看>>
Redis学习手册(Key操作命令)
查看>>
模板统计LA 4670 Dominating Patterns
查看>>
文件内容红帽子数据库.profile文件内容详解
查看>>
泛型第23条:请不要在新代码中使用原生态类型
查看>>
对象方法(转载)Java中finalize的使用
查看>>
一个截屏工具制作的全过程记录——如何使用“拿来主义”
查看>>