notes/ch14.md
operator和其后要定义的运算符号共同组成。this绑定到左侧运算对象。动态运算符符函数的参数数量比运算对象的数量少一个。data1 + data2;operator+(data1, data2);=)、下标([])、调用(())和成员访问箭头(->)运算符必须是成员。运算符:
| 可以被重载 | 不可以被重载 |
|---|---|
+, -, *, /, %, ^ | ::, .*, ., ? :, |
&, ` | , ~, !, ,, =` |
<, >, <=, >=, ++, -- | |
<<, >>, ==, !=, &&, ` | |
+=, -=, /=, %=, ^=, &= | |
|=, *=, <<=, >>=, [], () | |
->, ->*, new, new[], delete, delete[] |
ostream对象的引用。非常量是因为向流中写入会改变其状态;而引用是因为我们无法复制一个ostream对象。operator==,则这个类也应该定义operator!=。operator==,这样做可以使用户更容易使用标准库算法来处理这个类。<定义,则应该考虑为这个类定义<运算符。如果同时还包含==,则当且晋档<的定义和++产生的结果一直时才定义<运算符。int类型的形参。因为不会用到,所以无需命名。lambda是函数对象lambda捕获变量:lambda产生的类必须为每个值捕获的变量建立对应的数据成员,同时创建构造函数。标准库函数对象:
| 算术 | 关系 | 逻辑 |
|---|---|---|
plus<Type> | equal_to<Type> | logical_and<Type> |
minus<Type> | not_equal_to<Type> | logical_or<Type> |
multiplies<Type> | greater<Type> | logical_not<Type> |
divides<Type> | greater_equal<Type> | |
modulus<Type> | less<Type> | |
negate<Type> | less_equal<Type> |
标准库function类型:
| 操作 | 解释 |
|---|---|
function<T> f; | f是一个用来存储可调用对象的空function,这些可调用对象的调用形式应该与类型T相同。 |
function<T> f(nullptr); | 显式地构造一个空function |
function<T> f(obj) | 在f中存储可调用对象obj的副本 |
f | 将f作为条件:当f含有一个可调用对象时为真;否则为假。 |
定义为function<T>的成员的类型 | |
result_type | 该function类型的可调用对象返回的类型 |
argument_type | 当T有一个或两个实参时定义的类型。如果T只有一个实参,则argument_type |
first_argument_type | 第一个实参的类型 |
second_argument_type | 第二个实参的类型 |
function类型,它可以表示接受两个int,返回一个int的可调用对象。function<int(int, int)>operator type() const;const。bool的类型转换通常用在条件部分,因此operator bool一般定义成explicit的。a是一种类型,则表达式a sym b可能是:
a.operatorsym(b);operatorsym(a,b);