Have assignment operators return a reference to *this
为什么
其实返回void,返回对象本身等都是可以的,返回引用是为了一下两个原因:
- 允许连续赋值
- 防止返回对象时因为调用拷贝构造函数和析构函数带了不必要的开销(而且如果对象没有自定义拷贝构造函数,可能会产生错误)
场景
- 连续赋值如下,因此为了实现连续赋值,必须返回一个引用指向自身,这样后面的赋值才能生效;
1 | int x, y, z; |
- 有些场景下,必须返回指向自身的引用
1 | class Widget{ |
Handle assignment to self in operator=
动机
client在操作时很可能会出现,自我赋值的情况,比如:
1 | a[i] = a[j]; // i == j时 |
这种情况下,往往会出现安全性缺失的问题
1 | class Bitmap{}; |
方法
- 检查合法性
1 | Widget& operator=(const Widget& rhs){ |
但这个版本仍具有安全问题,如果new时抛出了异常,这样this会指向一块被删除了的内存;
- 保证异常安全性
1 | Widget& operator=(const Widget& rhs){ |
这个方法会降低效率,因为需要拷贝构造的函数
- copy&swap
这是一种更加高效的做法
1 | Widget& operator=(const Widget& rhs){ |
建议
- 令赋值操作返回一个reference to *this
- 确保自我赋值时的安全性,可以采用比较两个对象的地址是否相同,调整操作里的语句顺序,使用copy&swap的方法