《C Primer》
第一个形参通常是一个非常量的ostream对象的引用。非常量是因为向流中写入会改变其状态;而引用是因为我们无法复制一个ostream对象。输入输出运算符必须是非成员函数。
重载输入运算符>>第一个形参通常是运算符将要读取的流的因不用,第二个形参是将要读取到的(非常量)对象的引用。
输入运算符必须处理输入可能失败的情况,而输出运算符不需要。
算数和关系运算符(+、-、*、/)如果类同时定义了算数运算符和相关的复合赋值运算符,则通常情况下应该使用复合赋值来实现算数运算符。
相等运算符==如果定义了operator==,则这个类也应该定义operator!=。
相等运算符和不等运算符的一个应该把工作委托给另一个。相等运算符应该具有传递性。如果某个类在逻辑上有相等性的含义,则该类应该定义operator==,这样做可以使用户更容易使用标准库算法来处理这个类。
关系运算符如果存在唯一一种逻辑可靠的<定义,则应该考虑为这个类定义<运算符。如果同时还包含==,则当且晋档<的定义和++产生的结果一直时才定义<运算符。
赋值运算符=我们可以重载赋值运算符。不论形参的类型是什么,赋值运算符都必须定义为成员函数。
赋值运算符必须定义成类的成员,复合赋值运算符通常情况下也应该这么做。这两类运算符都应该返回左侧运算对象的引用。
下标运算符[]下标运算符必须是成员函数。
一般会定义两个版本:
1.返回普通引用。2.类的常量成员,并返回常量引用。
递增和递减运算符(++、—)
定义递增和递减运算符的类应该同时定义前置版本和后置版本。
通常应该被定义成类的成员。为了和内置版本保持一致,前置运算符应该返回递增或递减后对象的引用。同样为了和内置版本保持一致,后置运算符应该返回递增或递减前对象的值,而不是引用。后置版本接受一个额外的,不被使用的int类型的形参。因为不会用到,所以无需命名。
成员访问运算符(*、->)箭头运算符必须是类的成员。解引用运算符通常也是类的成员,尽管并非必须如此。
重载的箭头运算符必须返回类的指针或者自定义了箭头运算符的某个类的对象。解引用和乘法的区别是一个是一元运算符,一个是二元运算符。
函数调用运算符可以像使用函数一样,调用该类的对象。因为这样对待类同时也能存储状态,所以与普通函数相比更加灵活。
函数调用运算符必须是成员函数。一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或类型上有所区别。如果累定义了调用运算符,则该类的对象称作函数对象。
lambda是函数对象lambda捕获变量:lambda产生的类必须为每个值捕获的变量建立对应的数据成员,同时创建构造函数。
标准库定义的函数对象标准库函数对象: