读书笔记 effective c++ Item 10 让赋值运算符返回指向*this的引用
2017-02-15 23:42
288 查看
一个关于赋值的有趣的事情是你可以将它们链在一起:
同样有趣的是赋值采用右结合律,所以上面的赋值链被解析成下面这个样子:
在这里,15被赋值给z,然后赋值的结果(更新的z)被赋值给y,再然后赋值的结果(更新的Y)被赋值给x。
实现这个赋值链的方法是使赋值返回指向左边参数的引用,这也是你在为你的类实现赋值运算符的时候应该遵守的约定:
这个约定除了适用于上面的标准形式之外,也适用于所有的赋值运算符,因此:
这仅仅是一个约定,没有遵循这个约定的代码也能通过编译。然而,所有的内建类型和标准库(像string,vector,complex,tr1::shared_ptr等等)中的所有类型(或即将提供的类型,见Item54)都遵守这个约定。因此除非你有更好的理由,否则请遵守这个约定。
int x, y, z; x = y = z = 15; // chain of assignments
同样有趣的是赋值采用右结合律,所以上面的赋值链被解析成下面这个样子:
x = (y = (z = 15));
在这里,15被赋值给z,然后赋值的结果(更新的z)被赋值给y,再然后赋值的结果(更新的Y)被赋值给x。
实现这个赋值链的方法是使赋值返回指向左边参数的引用,这也是你在为你的类实现赋值运算符的时候应该遵守的约定:
class Widget { public: ... Widget& operator=(const Widget& rhs) // return type is a reference to { // the current class ... return *this; // return the left-hand object } ... };
这个约定除了适用于上面的标准形式之外,也适用于所有的赋值运算符,因此:
class Widget { public: ... Widget& operator+=(const Widget& rhs) // the convention applies to { // +=, -=, *=, etc. ... return *this; } Widget& operator=(int rhs) // it applies even if the { // operator’s parameter type ... // is unconventional return *this; } ... };
这仅仅是一个约定,没有遵循这个约定的代码也能通过编译。然而,所有的内建类型和标准库(像string,vector,complex,tr1::shared_ptr等等)中的所有类型(或即将提供的类型,见Item54)都遵守这个约定。因此除非你有更好的理由,否则请遵守这个约定。
相关文章推荐
- 图 简单c++邻接矩阵 无向图
- 类中非静态成员函数中的----this指针
- C++ 运算符重载
- c++ 虚继承
- leetcode 476 Number Complement C++
- 面试时关于c++方面的一些收获
- 探究C++中的菱形继承
- 图 简单滴C++邻接表 无向图
- 深入C++对象模型读书笔记(一、关于对象)
- C语言 · 数组查找及替换
- 从C到C++的升级之register关键字的升级
- C++:菱形继承和虚拟继承
- leetcode 500 Keyboard Row C++
- 用c语言实现1+2+3+...+n求和
- C++模板元编程
- c++运算符重载
- C语言中的操作符优先级
- PAT甲级1117
- C语言向有序数组中插入一个数使该数组仍保持有序
- ini解析库 c语言