C++程序设计语言第11章——运算符重载

基本信息

  • 原文件:/田浩然上传的资料/电子书/C_C++/The C++ Programming language 3rd/ch11.pdf
  • 大小:195.85 KB
  • 页数:40页
  • 作者:Bjarne Stroustrup
  • 处理日期:2026-09-30
  • 处理方法:PDF文本提取(pdf-inspector)
  • 笔记类型:技术书籍章节笔记

核心内容

本章是《The C++ Programming Language》第三版第11章,主题”运算符重载”。核心要点:

1. 运算符函数语法

  • 运算符函数名格式:operator + 运算符本身,如 operator+、operator<<
  • 支持的运算符:+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* -> [] () new new[] delete delete[]
  • 不能重载的运算符:::(作用域解析)、.(成员选择)、.*

2. 二元和一元运算符定义规则

  • 二元运算符:可由非静态成员函数(取一个参数)或友元/非成员函数(取两个参数)定义
  • 一元运算符:可由非静态成员函数(无参数)或友元/非成员函数(取一个参数)定义
  • 若两者都定义,重载决议决定使用哪个

3. 预定义运算符含义

  • operator=、operator[]、operator()、operator-> 必须是非静态成员函数
  • =(赋值)、&(取地址)、,(逗号)有预定义含义,可通过设为私有来隐藏

4. 复合类类型与运算符重载

以复数类 complex 为例,说明:

  • 成员运算符:complex& operator+=(complex)(访问表示内部数据)
  • 非成员运算符:complex operator+(complex a, complex b)(通过 += 实现)
  • 混合模式算术需定义接受不同类型参数的非成员运算符

5. 命名空间与运算符

  • 运算符可在命名空间中定义
  • 查找规则:先查上下文,再查操作数所属命名空间
  • 标准库中 operator<< 在 std 命名空间中定义

6. 特殊运算符

  • 下标运算符 []:常用于多维数组(用 operator()() 模拟)
  • 函数调用运算符 ():用于仿函数、迭代器
  • 解引用运算符 ->:用于智能指针,必须返回指针或可继续应用 -> 的对象
  • 自增/自减 ++/--:前缀和无参版本,后缀带 int 哑元参数区分

7. 字符串类设计示例

作者展示了最小化字符串类 String 的设计:

  • 使用引用计数实现写时复制(copy-on-write)
  • operator[] 返回 Cref 对象区分读写访问
  • 提供范围检查和不检查两种访问方式

8. 设计建议(14条)

  1. 运算符重载主要用于模拟常规用法
  2. 大对象使用 const 引用参数
  3. 大结果考虑优化返回值
  4. 适当时使用默认拷贝操作
  5. 需要时重新定义或禁止拷贝
  6. 需要访问表示时用成员函数
  7. 不需要访问表示时用非成员函数
  8. 使用命名空间关联辅助函数
  9. 对称运算符用非成员函数
  10. 多维数组下标用 ()
  11. 单参数尺寸构造函数声明为 explicit
  12. 优先使用标准 string
  13. 谨慎引入隐式转换
  14. 需要左值的运算符用成员函数

知识关联

可行动点

  • 在自定义容器类中实现 operator[]、operator<<、operator-> 等常用运算符
  • 对于矩阵/向量类,通过运算符重载提供数学表达式写法