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条)
- 运算符重载主要用于模拟常规用法
- 大对象使用
const引用参数 - 大结果考虑优化返回值
- 适当时使用默认拷贝操作
- 需要时重新定义或禁止拷贝
- 需要访问表示时用成员函数
- 不需要访问表示时用非成员函数
- 使用命名空间关联辅助函数
- 对称运算符用非成员函数
- 多维数组下标用
() - 单参数尺寸构造函数声明为
explicit - 优先使用标准
string - 谨慎引入隐式转换
- 需要左值的运算符用成员函数
知识关联
- 参见 Core-Python-Programming-Wesley-J-Chun(Python语言对比视角)
- 参见 Efficient C++ Performance Programming Techniques(C++性能编程)
- 参见 Stroustrup-C++Programming-Language-ch2-学习笔记(本章所属书籍的其他章节)
可行动点
- 在自定义容器类中实现
operator[]、operator<<、operator->等常用运算符 - 对于矩阵/向量类,通过运算符重载提供数学表达式写法