Item 11: Handle assignment to self in operator=
我们在重载一个类的赋值运算符时要考虑自我赋值的问题。有了指针和引用自我赋值不总是第一时间能够识别出来。
1 |
|
自我赋值主要考虑到 自我赋值安全性 和 异常安全性
1 | class Bitmap { ... }; |
既不自我赋值安全性也不异常安全性, 当 rhs == *this时,delete pb使得rhs.pb成为空值,接下来 new 的数据便是空的。
1 | Widget& Widget::operator=(const Widget& rhs) { |
判断两个地址是否相同,如果是自我赋值,就不做任何事。但开始就delete pb, 但 new 出现异常, pb就会置空出现风险。
1 | Widget& Widget::operator=(const Widget& rhs) { |
在C++中仔细地排列语句顺序通常可以达到异常安全, 比如我们可以先申请空间,最后再delete:
1 | Widget& Widget::operator=(const Widget& rhs) { |
一个更加通用的技术便是复制和交换(copy and swap):
1 | class Widget { |