0

0

C++怎么理解函数指针和函数对象_C++回调机制与STL仿函数

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-11-23 19:35:02

|

235人浏览过

|

来源于php中文网

原创

函数指针用于C风格无状态回调,轻量但难内联;函数对象可携带状态、支持重载且易被内联,更灵活;lambda作为现代C++的匿名仿函数,结合捕获列表简化状态管理,已成首选。STL通过仿函数实现算法与行为解耦,提升通用性。

c++怎么理解函数指针和函数对象_c++回调机制与stl仿函数

在C++中,函数指针和函数对象(仿函数)是实现回调机制的两种核心方式。它们都能将“可调用实体”作为参数传递,但底层机制和使用场景有所不同。理解它们的区别与联系,对掌握STL和设计灵活接口非常重要。

函数指用:C风格的回调基础

函数指针是指向函数的指针变量,可以用来调用特定签名的函数。它常用于实现简单的回调逻辑,尤其是在与C兼容的接口中。

例如:

int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }

// 函数指针类型定义 using BinaryOp = int (*)(int, int);

// 使用函数指针实现回调 int compute(int x, int y, BinaryOp op) { return op(x, y); }

// 调用示例 compute(5, 3, add); // 返回 8 compute(5, 3, subtract); // 返回 2

函数指针的优点是轻量、高效,适合固定签名的简单回调。缺点是无法携带状态,且语法略显晦涩。更重要的是,编译器通常无法内联函数指针调用,影响性能。

立即学习C++免费学习笔记(深入)”;

函数对象:支持状态与重载的仿函数

函数对象(也称仿函数,functor)是重载了 operator() 的类或结构体实例。它看起来像函数调用,但本质是对象,因此可以拥有成员变量和复杂行为。

例如:

struct MultiplyBy {
    int factor;
    MultiplyBy(int f) : factor(f) {}
int operator()(int x) const {
    return x * factor;
}

};

MultiplyBy triple(3); triple(5); // 返回 15

函数对象的优势在于:

  • 可以保存状态(如上面的 factor
  • 支持运算符重载,调用形式自然
  • 编译器能轻易内联 operator(),提升性能

这使得函数对象比函数指针更灵活,尤其适合泛型编程。

绘蛙-多图成片
绘蛙-多图成片

绘蛙新推出的AI图生视频工具

下载

STL中的仿函数与算法配合

STL大量使用函数对象作为算法的参数。标准库预定义了一些常用仿函数,如 std::plusstd::less 等,位于 头文件中。

例如:

#include 
#include 
#include 

std::vector nums = {3, 1, 4, 1, 5}; // 使用 std::greater 排序 std::sort(nums.begin(), nums.end(), std::greater

你也可以自定义仿函数传入STL算法:

struct IsEven {
    bool operator()(int n) const {
        return n % 2 == 0;
    }
};

std::count_if(nums.begin(), nums.end(), IsEven{});

这种设计让STL算法高度通用,用户只需提供“做什么”,而无需关心“如何做”。

Lambda表达式:现代C++的便捷替代

C++11引入的lambda本质上是匿名函数对象,编译器会为每个lambda生成唯一的闭包类型。

例如:

int threshold = 10;
auto is_greater = [threshold](int n) { return n > threshold; };
std::find_if(nums.begin(), nums.end(), is_greater);

lambda结合捕获列表,能轻松携带外部状态,语法也更直观。在大多数新代码中,lambda已取代传统函数指针和手写仿函数。

基本上就这些。函数指针适合简单、无状态的回调;函数对象和lambda则更适合现代C++的泛型与高性能需求。STL的设计充分体现了仿函数的价值——通过统一的调用接口,实现算法与行为的解耦。

相关专题

更多
Sass和less的区别
Sass和less的区别

Sass和less的区别有语法差异、变量和混合器的定义方式、导入方式、运算符的支持、扩展性等。本专题为大家提供Sass和less相关的文章、下载、课程内容,供大家免费下载体验。

200

2023.10.12

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

187

2025.07.04

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

PHP 表单处理与文件上传安全实战
PHP 表单处理与文件上传安全实战

本专题聚焦 PHP 在表单处理与文件上传场景中的实战与安全问题,系统讲解表单数据获取与校验、XSS 与 CSRF 防护、文件类型与大小限制、上传目录安全配置、恶意文件识别以及常见安全漏洞的防范策略。通过贴近真实业务的案例,帮助学习者掌握 安全、规范地处理用户输入与文件上传的完整开发流程。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.6万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号