六一的部落格


关关难过关关过,前路漫漫亦灿灿。



  1. 函数名

    使用关键字 operator , 后跟运算符

    形如

    operator+
  2. 返回类型

  3. 形参列表

    将运算符重载为成员函数, 其显式参数数量比运算符操作数个数少一个

    形参个数
    非成员函数 运算符操作数个数
    成员函数 运算符操作数个数减1
二元运算符
非成员函数 将左侧运算对象传递给第一个参数, 右侧运算对象传递给第二个参数
成员函数 左侧运算对象必须是类类型对象: 使用this指针绑定左侧运算对象/第一个运算对象, 将右侧运算对象传递给唯一参数

只有函数调用运算符可以拥有默认实参

重载运算符的优先级与结合律不变


运算符重载必须与类类型有关

  1. 将运算符重载为类的成员函数
  2. 重载运算符的形参列表至少包含一个类类型参数
    1int operator+(int, int);   // 错误
    

使用运算符的重载版本

  1. 间接调用: 将运算符作用于类型正确的实参
    1data1 + data2;
    2
    3data1 += data2;
  2. 直接调用: 通过函数名
    1operator+(data1, data2);  // 非成员函数
    2data1.operator+=(data2);  // 成员函数
    

将运算符重载非成员函数, 还是重载成员函数

  1. 必须作为成员函数

    -
    赋值运算符 =
    下标运算符 []
    调用运算符 ()
    成员访问运算符 ->
  2. 建议定义为成员函数

    改变对象状态, 或者与给定类型密切相关
    复合赋值运算符
    递增运算符 ++
    递减运算符 --
    解引用运算符 *
  3. 建议定义为非成员函数

    具有对称性, 任意一端运算对象可能发生隐式转换
    算术运算符
    相等运算符 == / 不等运算符 !=
    小于运算符 <
  4. 必须定义为非成员函数

    如果运算符具有对称性, 但左右两个运算对象类型不一致

  5. 其他

    运算符
    输入运算符 >> 必须为非成员函数
    输出运算符 << 必须为非成员函数

string的加运算符不是成员函数

1string s = "world";
2string t = s + "!";   // 正确
3string u = "hi" + s;  // 正确

运算符重载


  1. 函数名

    使用关键字 operator , 后跟运算符

    形如

    operator+
  2. 返回类型

  3. 形参列表

    将运算符重载为成员函数, 其显式参数数量比运算符操作数个数少一个

    形参个数
    非成员函数 运算符操作数个数
    成员函数 运算符操作数个数减1
二元运算符
非成员函数 将左侧运算对象传递给第一个参数, 右侧运算对象传递给第二个参数
成员函数 左侧运算对象必须是类类型对象: 使用this指针绑定左侧运算对象/第一个运算对象, 将右侧运算对象传递给唯一参数

只有函数调用运算符可以拥有默认实参

重载运算符的优先级与结合律不变


运算符重载必须与类类型有关

  1. 将运算符重载为类的成员函数
  2. 重载运算符的形参列表至少包含一个类类型参数
    1int operator+(int, int);   // 错误
    

使用运算符的重载版本

  1. 间接调用: 将运算符作用于类型正确的实参
    1data1 + data2;
    2
    3data1 += data2;
  2. 直接调用: 通过函数名
    1operator+(data1, data2);  // 非成员函数
    2data1.operator+=(data2);  // 成员函数
    

将运算符重载非成员函数, 还是重载成员函数

  1. 必须作为成员函数

    -
    赋值运算符 =
    下标运算符 []
    调用运算符 ()
    成员访问运算符 ->
  2. 建议定义为成员函数

    改变对象状态, 或者与给定类型密切相关
    复合赋值运算符
    递增运算符 ++
    递减运算符 --
    解引用运算符 *
  3. 建议定义为非成员函数

    具有对称性, 任意一端运算对象可能发生隐式转换
    算术运算符
    相等运算符 == / 不等运算符 !=
    小于运算符 <
  4. 必须定义为非成员函数

    如果运算符具有对称性, 但左右两个运算对象类型不一致

  5. 其他

    运算符
    输入运算符 >> 必须为非成员函数
    输出运算符 << 必须为非成员函数

string的加运算符不是成员函数

1string s = "world";
2string t = s + "!";   // 正确
3string u = "hi" + s;  // 正确