跳转至

Overloaded Operator

OOP - Overloaded Operator

运算符重载其实就是特殊的函数重载,体现了 C++ 的编译期多态

不可重载的 5 个运算符(口诀:“点、星、冒、问、尺”):

  1. .:成员访问运算符
  2. .*:成员指针引用运算符
  3. :::作用域解析运算符
  4. ?::三目条件运算符
  5. sizeof / typeid 等操作符

=(赋值)、[](下标)、()(函数调用)、->(指针访问)这四个运算符必须作为类的成员函数重载

遍历 STL 容器(如 map, list)时,迭代器为什么强烈建议写成 ++it 而不是 it++

后置 it++ 需要在内部创建一个临时对象保存之前的状态,然后再按值返回,这个拷贝开销对复杂的迭代器或者大对象是不容忽视的。前置 ++it 直接原地修改并返回引用,没有拷贝开销

函数调用运算符 operator() 和仿函数 (Functor)

如果一个类重载了 operator(),那么这个类的对象就可以“像普通函数一样”去被调用。这样的对象被称为仿函数

比起普通函数或函数指针,仿函数有什么好处

可以拥有属于自己的状态。仿函数本质是个对象,可以有成员变量,可以随时记录执行的状态,这在 STL 算法(如 std::sortstd::for_each 统计特定数据)中极其好用

此外,它也是现代 C++ 中 Lambda 表达式的底层实现原理。编译器遇到 Lambda 时,相当于在底层默默帮你生成了一个带有 operator() 的匿名仿函数类

智能指针的底层依赖 operator*operator->

智能指针(如 shared_ptr, unique_ptr)之所以能表现得像个真正的裸指针,本质就是因为它们内部分别重载了:

  1. T& operator*():返回内部裸指针指向对象的引用
  2. T* operator->():直接返回内部封装的裸指针,然后 C++ 编译器会有特权将其连写展开访问其成员

评论区

欢迎在评论区指出文档错误,为文档提供宝贵意见,或写下你的疑问