Overloaded Operator¶
运算符重载其实就是特殊的函数重载,体现了 C++ 的编译期多态
不可重载的 5 个运算符(口诀:“点、星、冒、问、尺”):
.:成员访问运算符.*:成员指针引用运算符:::作用域解析运算符?::三目条件运算符sizeof/typeid等操作符
=(赋值)、[](下标)、()(函数调用)、->(指针访问)这四个运算符必须作为类的成员函数重载
遍历 STL 容器(如 map, list)时,迭代器为什么强烈建议写成 ++it 而不是 it++
后置 it++ 需要在内部创建一个临时对象保存之前的状态,然后再按值返回,这个拷贝开销对复杂的迭代器或者大对象是不容忽视的。前置 ++it 直接原地修改并返回引用,没有拷贝开销
函数调用运算符 operator() 和仿函数 (Functor)
如果一个类重载了 operator(),那么这个类的对象就可以“像普通函数一样”去被调用。这样的对象被称为仿函数
比起普通函数或函数指针,仿函数有什么好处
可以拥有属于自己的状态。仿函数本质是个对象,可以有成员变量,可以随时记录执行的状态,这在 STL 算法(如 std::sort 或 std::for_each 统计特定数据)中极其好用
此外,它也是现代 C++ 中 Lambda 表达式的底层实现原理。编译器遇到 Lambda 时,相当于在底层默默帮你生成了一个带有 operator() 的匿名仿函数类
智能指针的底层依赖 operator* 与 operator->
智能指针(如 shared_ptr, unique_ptr)之所以能表现得像个真正的裸指针,本质就是因为它们内部分别重载了:
T& operator*():返回内部裸指针指向对象的引用T* operator->():直接返回内部封装的裸指针,然后 C++ 编译器会有特权将其连写展开访问其成员
评论区
欢迎在评论区指出文档错误,为文档提供宝贵意见,或写下你的疑问