14.1 函数调用运算符
基本情况
- 重载的运算符:()
- 该类的对象为函数对象,可以用作泛型算法的实参
与lambda表达式的关系
- lambda表达式中的形参是函数对象的数据成员
- lambda表达式中的捕获列表是函数对象的形参
- lambda表达式很方便,当某个操作不经常使用又很简单时,可用lambda来代替函数对象
标准库中的函数对象
- 头文件:functional
- 模式:模板
- 注意点
- 在定义优先队列等适配器时,需同时声明队列的默认容器,且不加函数对象的调用运算符
- 在使用泛型算法时,需加函数对象的调用运算符
三种表达函数方式的整合
- 头文件:functional
- 关键字:function
- 函数的三种表达方式
- 普通函数
- 函数对象
- lambda表达式
- 要求:function是模板,必须提供函数的有关信息(签名)
注:如果因为重载函数而出现二义性,可通过存储函数指针或生成一个lambda表达式完成。
14.2 类型转换运算符
基本情况
- 形式:operator type()
- 要求:可以转换成指针和引用,但不能直接转换成数组或函数。
注:类型转换不能过度定义
显示的类型转换
- 问题:没有定义相关操作的对象,可能通过类型转换产生意想不到的结果。
- 方法:在定义时注明explicit,表明必须通过静态转换才能实现。
对于重载的运算符,无论是成员或非成员函数,都在匹配范围内。