news 2026/10/26 15:35:55

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/10/26 12:39:13

如何永久删除安卓设备中的照片(已验证)

当你从 Android 手机中删除照片时&#xff0c;它们通常并没有真正消失。它们可能残留在“最近删除”相册、云备份中&#xff0c;或者可以通过专门的工具恢复。本指南将引导你使用几种方法永久删除 Android 设备上的照片&#xff0c;确保你的私人照片保持私密。快速浏览一下这些…

作者头像 李华
网站建设 2026/10/24 15:20:15

什么是PFC

文章目录为什么需要PFCPFC是如何工作的rPFCPFC&#xff08;Priority-based Flow Control&#xff09;的含义是基于优先级的流量控制&#xff0c;它是目前应用最广泛的能够有效避免丢包的流量控制技术&#xff0c;是智能无损网络的基础。使能了PFC功能的队列&#xff0c;我们称之…

作者头像 李华
网站建设 2026/10/23 5:15:05

Python文件读取代码中strip()的作用

这行代码 line.strip() 的作用是&#xff1a; 主要功能 去除字符串 line 两端的空白字符。 具体会去除的字符包括&#xff1a; 空格 (space, )换行符 (newline, \n)回车符 (carriage return, \r)制表符 (tab, \t)其他空白字符&#xff08;如垂直制表符等&#xff09; 在这个具…

作者头像 李华
网站建设 2026/10/23 8:07:28

别再层层嵌套公式了!升级下Excel,秒变专业级Access!

现在还在Excel里一层一层套公式的人&#xff0c;心里大多都有数&#xff1a;这条路越来越难走了。只是很多人憋着一股劲&#xff0c;不敢直接说出口。一张表&#xff0c;为什么会越做越不对劲&#xff1f;刚开始做Excel的时候&#xff0c;其实都很顺。录数据、算合计、拉数据透…

作者头像 李华
网站建设 2026/10/23 11:19:49

mysql “黑名单“

目的&#xff1a;使用iptables禁止121.43.122.130客户端连接140.143.94.243机器上部署的mysql部署MySQL的机器客户端140.143.94.243121.43.122.130安装 iptables-services&#xff08;若没装&#xff09;yum install -y iptables-services让 systemd 接管iptablessystemctl sta…

作者头像 李华