没有躲过的坑--重载赋值运算符的自我赋值
来源:互联网 发布:淘宝手机单怎么刷步骤 编辑:程序博客网 时间:2024/04/30 11:03
C++中有个很重要的事情,就是对于类重载赋值运算符,而达到我们想要的结果。
先看看这几行代码:
//Window 是一个类Window w;w = w; // 再傻的人也不会这么干w[i] = w[j]; // 这个情况偶尔会发生
作为一个优秀的工程师,就要考虑到任何可能的情况。
看一段更加完整的代码:
class ScrollBar {};class Window{ ScrollBar *sb;public: Window(ScrollBar *s) : sb(s) {} Window() = default; Window& operator=(const Window&);};Window& Window::operator=(const Window& rhs){ delete sb; sb = new ScrollBar(*rhs.sb); return *this;}int main(){ Window w(new ScrollBar); Window w2(w);}
这段代码到底有什么坑儿呢?
设想一下,如果 *this 和rhs 是同一个实例对象呢?
那么
delete sb;sb = new ScrollBar(*rhs.sb);
就会造成严重的问题。
再delete sb后, 我们试图去访问一个已经被删除的rhs。这当然是致命的坑儿了。
跨越这个坑儿:
if (this == &rhs) return *this;delete sb;sb = new ScrollBar(*rhs.sb);return *this;
上面这段代码几乎所有的教科书都会这么讲,但是曾经一个arcserver的工程师跟我讲,这样同样存在危险,不是完美的:
试想一下,如果我们delete sb后发生了异常怎么办?这个时候,就会有存在一个没有指向任何东西的指针。所以下面这样写会更好:
Window& Window::operator=(const Window& rhs){ if (this == &rhs) return *this; ScrollBar *sbOld = sb; sb = new ScrollBar(*rhs.sb); delete sbOld; return *this;}
2 0
- 没有躲过的坑--重载赋值运算符的自我赋值
- 赋值运算符的重载
- C++赋值构造函数和赋值运算符的重载
- 赋值运算符的重载函数
- 重载赋值运算符怎么使用的
- 33.C++赋值运算符的重载
- C++ =赋值运算符的重载
- C++中赋值运算符的重载
- 第一题 赋值运算符的重载
- 赋值运算符的重载函数
- 运算符重载--类的赋值运算符重载
- 运算符重载-赋值运算符的重载
- 区分一下强制类型转换运算符重载/赋值运算符重载/对象定义的赋值
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- zip
- JAVA知识回顾-4(Exception、Error、OOM、Java面向对象特征含义、Override和Overload含义区别)
- Android启动常见手机自带邮件包名汇总,用于分享功能等
- Android知识点(总结中)
- SQL 获取年 月的数据
- 没有躲过的坑--重载赋值运算符的自我赋值
- 遭瘟的pyodbc——关于存储过程执行
- Linux命令行删除文件恢复(Ubuntu)
- 项目字符集修改
- ApplicationContext、ActivityContext、ViewContext和ContextImpl(BaseContext)的区别
- 猜数字游戏
- 第一次写博客,《FPGA学习笔记》
- hack this site learn -----> Basic missions
- C/C++——构造函数和析构函数