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

C++ 仿函数揭秘:让对象像函数一样被调用!

🧩 C++ 仿函数揭秘:让对象像函数一样被调用!

大家好!今天我们来认识一个既神奇又实用的 C++ 特性——函数调用运算符operator()的重载

你可能想不到:

一个对象,居然可以直接“加括号”调用,就像函数一样

这种技术在 STL(标准模板库)中无处不在,比如sort的自定义比较器、priority_queue的优先级规则……它们背后,往往就是一个仿函数(Functor)!


🔑 什么是仿函数?

仿函数(Functor) =重载了()运算符的类对象

它看起来像函数,用起来像函数,但本质上是一个对象——这意味着它可以:

  • 拥有状态(成员变量)

  • 被模板参数传递

  • 比普通函数更灵活!


✅ 示例一:打印仿函数

来看你写的第一个例子:

class MyPrint { public: void operator()(string text) { cout << text << endl; } }; void test01() { // 重载的()操作符 也称为仿函数 MyPrint myFunc; myFunc("hello world"); }

这里,myFunc是一个MyPrint对象,但你可以像调用函数一样写:

myFunc("hello world");

编译器会自动调用myFunc.operator()("hello world")

是不是很像函数?但它其实是个有行为的对象


✅ 示例二:加法仿函数 + 匿名对象

再看你的第二个例子:

class MyAdd { public: int operator()(int v1, int v2) { return v1 + v2; } }; void test02() { MyAdd add; int ret = add(10, 10); cout << "ret = " << ret << endl; // 匿名对象调用 cout << "MyAdd()(100,100) = " << MyAdd()(100, 100) << endl; }

输出:

ret = 20 MyAdd()(100,100) = 200

注意这行:

MyAdd()(100, 100)
  • MyAdd()创建了一个匿名临时对象

  • 紧接着(100, 100)调用了它的operator()

  • 一行代码完成“创建 + 调用”,简洁又高效!


🌟 仿函数 vs 普通函数 vs Lambda

特性

普通函数

Lambda 表达式

仿函数(重载()

可携带状态

✅(通过捕获)

✅(成员变量)

可作为模板参数

✅(函数指针)

✅(类型安全)

性能

极高

(可内联)

可重复使用

通常一次

💡 正因如此,STL 大量使用仿函数(如greater<int>,less<string>)!


📌 关键特点总结

  • operator()可以接受任意数量、任意类型的参数(非常灵活!)

  • 返回值类型也由你决定(可以是voidint、自定义类型等)

  • 仿函数本质是对象,因此可以保存状态、继承、多态

  • 匿名对象 + 仿函数 = 一行实现“即用即弃”的逻辑


✅ 为什么叫“仿”函数?

因为它模仿函数的调用语法,但底层是对象的方法调用
这种设计巧妙地融合了面向对象函数式编程的优点。


如果你觉得这篇推文让你对 STL 的设计更理解了一层,欢迎点赞、收藏、转发!
也欢迎留言:“你用仿函数解决过什么实际问题?”


http://www.jsqmd.com/news/150210/

相关文章:

  • CSS3 新增长度单位
  • 观察者模式与事件中心
  • 2025年洁净室复合夹芯板厂家权威推荐:江苏言信环境科技深度解析玻镁、铝蜂窝等核心板材技术优势与选购指南 - 品牌企业推荐师(官方)
  • 语音识别+视觉+NLP:TensorRT通吃各类AI模型
  • 【计算机毕业设计案例】基于springboot的老年志愿者服务智慧平台老年志愿者报名服务老年志愿者报名服务(程序+文档+讲解+定制)
  • AI的副驾驶已就位:“人人都是产品经理”时代真正到来?
  • 2025年防腐风机厂家推荐:武汉熙诚环保科技领衔,七类工业风机技术革新与永磁节能先锋深度解析 - 品牌企业推荐师(官方)
  • bkViewer(数码照片浏览器)
  • 基于TensorRT的教育答疑机器人响应优化项目
  • TensorRT与OpenTelemetry集成实现分布式追踪
  • RAG技术入门:检索增强生成如何让大模型更强大
  • [Quicker] 减减闪填 - 源码归档
  • 算力与数据基建:AI量化的“硬件位面”
  • 【毕业设计】基于JAVA技术的电商精准营销推荐系统设计及实现(源码+文档+远程调试,全bao定制等)
  • 2025必备10个降AIGC工具,MBA高效应对AI检测!
  • 2025年智能服务机器人厂商推荐:广州光泰机器人科技领衔,八大前沿应用场景实力品牌深度解析与选购指南 - 品牌企业推荐师(官方)
  • Java毕设项目推荐-基于springboot的老年志愿者服务智慧平台社区服务、助老帮扶、文化宣传【附源码+文档,调试定制服务】
  • GEO源码对接指南 打通多平台数据壁垒 - 源码云科技
  • 总结 Next.js 中的 Server Actions
  • 护理“大模型+知识图谱“实践的智能化突破:基于大模型构建乳腺癌化疗所致恶心呕吐知识图谱
  • MySQL 事务隔离级别与 MVCC 深度解析
  • 2025年东莞肥仔秋食品公司深度解析:地标美食品牌核心竞争力与市场战略权威指南 - 品牌企业推荐师(官方)
  • NVIDIA NGC目录中TensorRT资源获取完全指南
  • SpringMVC新版本踩坑[已解决] - 详解
  • Trae智能体SOLO中国版
  • 2025年高效喷淋塔厂家推荐:武汉熙诚环保科技领衔,PP废气净化塔与酸雾喷淋塔实力品牌深度解析 - 品牌企业推荐师(官方)
  • ABC438
  • 构建自动化CI/CD流程:TensorRT模型持续集成
  • Java计算机毕设之基于Spring Boot 社区助老志愿者服务平台的设计与实现基于springboot的老年志愿者服务智慧平台(完整前后端代码+说明文档+LW,调试定制等)
  • 计算机Java毕设实战-基于JAVA技术的电商精准营销推荐系统设计及实现基于Spring Boot的电商精准营销推荐系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】