第十四章主要讲运算符重载和类型转换(感觉每次第一句话都是废话):

  1. 不应该被重载的运算符:&& || ,因为无法保留其运算顺序(还有逻辑运算符的短路运算属性),而对于逗号和取址运算,语言已经定义了其对于类的特殊含义
  2. 必须定义为成员函数的运算符:= [] () ->(语言也禁止这样做)
  3. 对于需要对称性的运算符(+),可能会转换任一端参数,定义为普通函数
  4. 对于输入输出运算符的重载,注意:
    1. 减少格式化输出,不应该添加换行符
    2. 输入输出运算符必须是非成员函数
    3. 输入运算符中应处理出错情况,负责从错误中恢复;输出运算符则不需要考虑错误
  5. 同时定义了算术运算符和相关的复合赋值运算,应优先使用复合赋值(开销小)
  6. 递增递减运算的原型:

    class X{
    public:
        X& operator++();    //前置
        X operator++(int);  //后置,其中参数不会用到
    };
    
  7. 下表运算一般定义两个版本,普通的返回引用,加const限定符的返回常量引用

  8. lambda表达式产生的类不含默认构造函数、赋值运算符、默认析构函数

  9. cpp的可调用对象有:函数、函数指针、lambda表达式、bind对象、函数对象

  10. std::function模版可以用来存放或者说是接受可调用对象,但是不能放重载函数,解决方案是使用函数指针活着lambda给重载函数做一个“别名”。

  11. 类型转换函数,可以定义为转换成任何能作为函数返回类型的类型(数组、函数类型就不行,但是数组指针和函数指针可以);必须是类的成员函数;无返回类型参数列表;通常const限定:

    operator type() const;
    
  12. 显示的类型转换运算符,就是在前面加explicit,使用时必须用cast。例外:

    1. if,while,do语句条件部分
    2. for语句条件部分
    3. ! || &&运算对象
    4. 条件运算符表达式(?:)的条件部分

    这些语句中会隐式的调用显示类型转换运算符中转换为bool的那类。比如io库中,我们经常用:

    while(cin>>n){
    ...
    }
    

    所以,一般向bool型的类型转换我们可以大胆的写成explicit的(一般也只定义向bool的转换)