一、重载运算符由关键字operator和其后要定义的运算符号组成
二、对于二元运算符,左侧运算对象传递给第一个参数,右侧运算对象传递给第二个参数,除了重载的函数调用运算符operator()外,其他重载运算符不能含有默认实参
三、如果一个运算符函数是成员函数,则它的第一个运算对象绑定到隐式的this指针上,因此,成员运算符函数的参数数量比运算符的运算对象总数少一个
四、对于一个重载的运算符来说,其优先级和结合律与对应的内置运算符一致
五、不能被重载的运算符: (::) ( .*) (.) (? :)
六、不应该被重载的运算符: (&&) (||) (,) (&)
七、将运算符定义为成员函数还是普通的非成员函数的选择:
1、赋值(=)、下标([])、调用(())、成员访问箭头(->)运算符必须是成员
2、复合赋值运算符一般应该是成员
3、改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递减和解引用运算符,通常是成员
4、具有对称性的运算符可能转换任意一端的运算对象,如算术、相等性、关系和位运算符,通常应该是普通的非成员函数
八、在执行输入运算符时可能发生下列错误:
1、当流含有错误类型的数据时读取操作可能失败
2、当读取操作到达文件末尾或遇到输入流的其他错误时会失败
九、如果一个类包含下标运算符,则通常会定义2个版本:一个返回普通引用,1个是类的常量成员并返回常量引用
十、后置递增/递减版本接受一个额外的int类型的形参,用于区分是前置版本还是后置版本
十一、如果类定义了调用运算符,则该类的对象称作函数对象
十二、几种可调用的对象: 函数、函数指针、lamba表达式、bind创建的对象、重载了函数调用运算符的类
十三、调用形式指明了调用返回的类型以及传递给调用的实参类型
十四、函数表通常通过map来实现
十五、转换构造函数和类型转换运算符共同定义了类类型转换: operator type() const, type表示某种类型,类型转换运算符可以面向任意类型,只要该类型能作为函数的返回类型,因此,不允许转换称数组或函数类型,但允许转换称指针或引用类型
十六、因为类型转换运算符是隐式执行的,所以无法给这些函数传递参数,也就不能在类型转换运算符的定义中使用任何形参
class StrVec
{
public:
// 下标运算符通常定义2个版本,一个返回普通引用,一个是类的常量成员并且返回常量引用
string& operator[](size_t n)
{
return elements[n];
}
const string& operator[](size_t n) const
{
return elements[n];
}
// 前置运算符
StrVec& operator++();
StrVec& operator--();
// 后置版本通常接受一个额外的int类型的形参,作用是区分前置版本和后置版本
StrVec& operator++(int);
StrVec& operator--(int);
private:
string* elements;
};