运算符重载的基本概念

  • 对抽象数据类型也能够直接使用C++提供的运算符

    1
    2
    3
    返回值类型 operator 运算符(形参表) {
    ...
    }
  • 在程序编译时

    • 把 含运算符的表达式 -> 对 运算符函数 的调用
    • 把 运算符的操作数 -> 运算符函数的参数
    • 运算符被多次重载时, 根据 实参的类型 决定调用哪个运算符函数
  • 重载为普通函数时, 参数个数为运算符目数

  • 重载为成员函数时, 参数个数为运算符目数减一(第二个参数)

  • 不允许定义新的运算符

  • 不是所有运算符都能被重载

  • () [] -> = 重载时必须声明为类的成员函数

赋值运算符的重载

  • 赋值运算符 “=” 只能重载为 成员函数

  • 浅复制/浅拷贝

    • 执行逐个字节的复制(指针)工作

      image-20250120222102931

  • 深复制/深拷贝

    • 将一个对象中指针变量指向的内容复制到另一个对象中指针成员对象指向的地方

      image-20250120222107009

  • 赋值运算符重载返回类型void不好 如: a = (b = c)

  • 用参数的引用类型作为返回类型比较好

运算符重载为友元函数

  • 运算符重载为普通函数时可以访问类的私有信息

    • 如: c = c + 5 和 c = 5 + c 就要重载为普通函数而不能为成员函数, 这时候就有必要重载为友元函数了

流插入运算符和流提取运算符的重载

1
2
3
4
cout << 5;				// 对参数为int重载
cout << "this"; // 对参数为char*重载
cout << 5 << "this"; // 返回值为ostream&
cout << 自定义对象; // 定义普通重载函数

自增/自减运算符的重载

  • 前置: 一元运算符

  • 后置: 二元运算符

    • 多写一个参数, 具体无意义(等价于0)

类型强制转换运算符的重载

  • 不能写返回值类型

  • 实际上其返回值类型为强制转换运算符代表的类型

    1
    2
    3
    operator int() {
    ...
    }