news 2026/4/23 13:10:53

C++ 中仿函数和函数对象这两个术语的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 中仿函数和函数对象这两个术语的区别

先明确核心定义

1. 本质(通用理解)

无论是 “仿函数” 还是 “函数对象”,本质都是:一个重载了()运算符的类的实例(对象)。它的核心特点是:看起来像函数(能像函数一样调用),但本质是对象,因此可以携带状态(成员变量),这是普通函数 / 函数指针做不到的。

2. 细分语境下的微小差异(仅作了解)
术语细分语境下的含义日常使用场景
函数对象(Function Object)更偏向 “概念 / 定义”:指所有具备函数行为的对象(包括重载()的类实例、lambda 表达式等)官方 / 标准文档常用
仿函数(Functor)更偏向 “实现 / 特指”:专指通过重载()实现的类对象(lambda 是函数对象,但一般不叫仿函数)程序员口语 / 教材常用

简单说:仿函数是函数对象的一个子集,但在日常开发和学习中,大家不会严格区分,说 “仿函数” 就是指 “函数对象”,反之亦然。

代码示例:直观理解(仿函数 / 函数对象)

下面的代码展示了最典型的 “仿函数 / 函数对象”,以及它和普通函数、lambda(另一种函数对象)的对比:

cpp

运行

#include <iostream> #include <vector> #include <algorithm> using namespace std; // 1. 定义一个仿函数(函数对象)类:重载()运算符 class AddNum { private: int base; // 可以携带状态(这是普通函数做不到的) public: // 构造函数初始化状态 AddNum(int b) : base(b) {} // 重载()运算符,使其能像函数一样被调用 int operator()(int num) const { return num + base; } }; // 2. 普通函数(对比用) int add5(int num) { return num + 5; } int main() { // ========== 仿函数(函数对象)的使用 ========== // 创建仿函数对象(携带状态:base=10) AddNum add10(10); // 像调用函数一样调用对象 cout << "5 + 10 = " << add10(5) << endl; // 输出:15 // 更换状态:base=20 AddNum add20(20); cout << "5 + 20 = " << add20(5) << endl; // 输出:25 // ========== 结合STL算法使用(核心场景) ========== vector<int> vec = {1, 2, 3, 4, 5}; // 用仿函数作为算法的参数(比函数指针更灵活,能带状态) cout << "遍历vec,每个元素+10:"; for_each(vec.begin(), vec.end(), [&](int num) { cout << add10(num) << " "; // 输出:11 12 13 14 15 }); cout << endl; // ========== lambda是函数对象,但一般不叫仿函数 ========== auto add15 = [](int num) { return num + 15; }; cout << "5 + 15 = " << add15(5) << endl; // 输出:20 return 0; }

关键对比:仿函数 vs 普通函数

特性仿函数(函数对象)普通函数
本质类的实例(对象)一段可执行代码
能否携带状态能(通过成员变量)不能(只能用全局变量,不推荐)
能否作为模板参数能(STL 算法优化的关键)不能
调用方式像函数一样(obj()直接调用

总结

  1. 日常使用:仿函数 = 函数对象,均指 “重载了()运算符的类的实例”,是 STL 算法中灵活传递自定义逻辑的核心方式。
  2. 细分差异:函数对象是更宽泛的概念(包含 lambda、仿函数等),仿函数专指 “通过类重载()实现的函数对象”。
  3. 核心优势:仿函数能携带状态、可作为模板参数,比普通函数 / 函数指针更灵活,是 STL 算法自定义逻辑的首选。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:25:56

【消息队列】产品介绍

目录 Kafka 定义 基本概念 售卖方式 Kafka 原理 Kafka 产品优势 应用场景 使用限制及开源对比 Rabbit MQ 定义 售卖方式 名词解释 产品优势 应用场景 RocketMQ 概念定义 售卖方式 基本概念 开源对比优势 应用场景 MQTT 定义 名词解释 售卖方式 应用场景…

作者头像 李华
网站建设 2026/4/23 12:11:32

科技赋能洁净厂区 明诺E810FB助力江苏上骐集团绿色发展

作为深耕电气机械制造领域的标杆企业&#xff0c;江苏上骐集团始终秉持“绿色生产、精细管理”的发展理念&#xff0c;在推进高效新结构永磁电机生产线智能化技改的同时&#xff0c;更将厂区环境优化提升至战略高度。为破解传统清洁模式效率低下、扬尘污染等痛点&#xff0c;打…

作者头像 李华
网站建设 2026/4/23 10:45:00

收藏!Java开发者转型大模型开发全指南:优势+路径+实践心得

在AI技术席卷全球的当下&#xff0c;大模型开发已然成为技术领域的“黄金赛道”。作为一名深耕Java后端多年的开发者&#xff0c;我经常在技术社区被问到&#xff1a;“传统后端开发者能搭上AI快车吗&#xff1f;”我的答案始终坚定&#xff1a;不仅能&#xff0c;Java开发者的…

作者头像 李华
网站建设 2026/4/23 5:53:50

JNPF 权限示例太绝了!PC/APP 全场景覆盖,授权逻辑一看就懂

配置用户权限总踩坑&#xff1f; PC 端和 APP 端权限分不清、角色 岗位权限叠加一脸懵、流程 / 打印权限不知道咋分配&#xff1f; JNPF 直接甩出保姆级权限操作示例&#xff01;从无权限场景到角色 岗位叠加授权&#xff0c;从 PC 端到 APP 端&#xff0c;10 常见场景全覆…

作者头像 李华
网站建设 2026/4/23 12:14:48

Windows 权限维持之 Meterpreter 深度解析

目录 Windows 权限维持之 Meterpreter 深度解析 一、Meterpreter 权限维持概述 二、Meterpreter 权限维持技术详解 &#xff08;一&#xff09;Persistence 模块 - 注册表后门 &#xff08;二&#xff09;Meterpreter 服务后门&#xff08;Meterpreter SVC&#xff09; 三、其他…

作者头像 李华