当前位置: 首页 > web >正文

什么是函数对象

在C++中,函数对象(Function Object)又称仿函数(Functor),是通过定义 operator() 运算符重载的类或结构体实例,使其行为类似函数。它比普通函数更灵活,可存储状态(成员变量),支持泛型编程和算法定制。
 
核心特性
 
1. 重载 operator() :使类实例可像函数一样调用。
 
2. 可携带状态:通过成员变量存储数据,在调用时使用。
 
3. 类型安全:编译期确定行为,比函数指针更可靠。
 
4. 适配算法:可与STL算法(如 sort 、 for_each )结合使用。
 
代码示例
 
1. 基础函数对象(无状态)
 
cpp   
#include <iostream>
using namespace std;

// 定义函数对象类(无状态)
class Add {
public:
    int operator()(int a, int b) const { // 常成员函数
        return a + b;
    }
};

int main() {
    Add add_obj; // 创建函数对象实例
    int result = add_obj(3, 5); // 像函数一样调用
    cout << "3 + 5 = " << result << endl; // 输出:8
    return 0;
}
 
 
2. 带状态的函数对象
 
cpp   
#include <iostream>
using namespace std;

// 带状态的函数对象:存储一个加数n
class Adder {
private:
    int n; // 成员变量存储状态
public:
    // 构造函数初始化状态
    Adder(int num) : n(num) {} 

    // 重载()运算符,使用状态n
    int operator()(int x) const {
        return x + n;
    }
};

int main() {
    Adder add_10(10); // 创建加数为10的函数对象
    cout << add_10(5) << endl; // 输出:15(5 + 10)
    Adder add_20(20);
    cout << add_20(5) << endl; // 输出:25(5 + 20)
    return 0;
}
 
 
3. 与STL算法结合(排序自定义比较规则)
 
cpp   
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 函数对象:降序比较
class CompareDesc {
public:
    bool operator()(int a, int b) const {
        return a > b; // 降序排列
    }
};

int main() {
    vector<int> nums = {3, 1, 4, 2};
    // 使用函数对象作为排序的比较规则
    sort(nums.begin(), nums.end(), CompareDesc()); 
    for (int num : nums) {
        cout << num << " "; // 输出:4 3 2 1
    }
    return 0;
}
 
 
4. 模板函数对象(泛型支持)
 
cpp   
#include <iostream>
using namespace std;

// 模板函数对象:支持任意类型加法
template <typename T>
class GenericAdder {
public:
    T operator()(T a, T b) const {
        return a + b;
    }
};

int main() {
    GenericAdder<int> int_adder;
    cout << int_adder(2, 3) << endl; // 输出:5(int类型)

    GenericAdder<double> double_adder;
    cout << double_adder(1.5, 2.5) << endl; // 输出:4(double类型)
    return 0;
}
 
 
与普通函数的区别
 
表格   
特性 普通函数 函数对象(仿函数) 
状态存储 无 可通过成员变量存储状态 
类型安全 运行时确定(函数指针) 编译期确定(类型明确) 
可适配性 需通过函数指针或lambda 直接适配STL算法 
扩展性 难以修改行为 可通过继承/模板扩展 
 
应用场景
 
- STL算法定制:如 sort 的比较器、 transform 的操作函数。
 
- 策略模式:通过不同函数对象实现算法的动态切换。
 
- 状态化操作:需要携带上下文数据的函数逻辑(如累加器、计数器)。
 
C++的函数对象结合了面向对象和泛型编程的优势,是编写高效、灵活代码的重要工具。

http://www.xdnf.cn/news/12933.html

相关文章:

  • 【ArcGIS技巧】—村庄规划规划用地规划状态字段生成工具
  • 并发请求函数batchRequests
  • 类加载的过程
  • 【算法笔记】树套树
  • RSA和AES算法核心区别和原理解析
  • Python地理数学可视化:基于函数生成真实感地形
  • WebFuture 升级提示“不能同时包含聚集KEY和大字段””的处理办法
  • 【Docker 02】Docker 安装
  • 71常用控件_QHBoxLayout的使用
  • 浅谈未来汽车电子电气架构发展趋势中的通信部分
  • 【无人机】MavLink通讯协议的回调解析函数及状态机
  • AtCoder Beginner Contest 409(ABCDEF)
  • 深入解析对比学习:原理、应用与技术实现
  • 前端打包工具简单介绍
  • JavaWeb 三层架构简单介绍与案例实现
  • QEMU源码全解析 —— 块设备虚拟化(24)
  • 【Linux应用】Linux系统日志上报服务,以及thttpd的配置、发送函数
  • Java八股文——并发编程「场景篇」
  • 湖北理元理律师事务所实务手记:个人债务管理的理性突围
  • 65、.NET 中DllImport的用途
  • 轻量级数学竖式训练方案解析
  • Go语言多线程问题
  • Java 中字节流的使用详解
  • 用 AI 开发 AI:原汤化原食的 MCP 桌面客户端
  • UDP连接套接字与异步Socket通道详解
  • Java核心技术-卷I-读书笔记(第十二版)
  • ESP12E/F 参数对比
  • 单线程模型中消息机制解析
  • Map 接口
  • 【学习笔记】0-RTT