函数指针、函数对象、lambda 表达式、std::function
1. 函数指针
函数指针 (Function Pointer) 就是指向函数地址的指针
1 | int Sum(int a, int b) { |
2. 函数对象
函数对象,也就是 Function Object, 也被称为 Functor,它可以被当作一个函数来调用。通常指重载了 operator() 的类对象。因为它是一个对象,因此它的优势是可以保存一些状态,比如下面的 padding 属性. 不过相对函数指针,多增加了一个类的实现,二进制体积也相应地增加。
1 | class SumClass { |
3. Lambda 表达式
lambda 表达式内部会创建一个上面所说的函数对象, 不过是匿名的, 只有编译器知道类名是什么. lambda 可以捕获外部的变量, 都会转换为匿名函数对象的属性值来保存.
1 | int padding = 3; |
我们用 cppinsight 来看一下转换后的代码:
1 | int padding = 3; |
可见,编译器会为我们生成一个类,并创建一个 functor 类 __lambda_11_19,最终调用 functor. 因为 lambda 中值捕获了 padding 参数,因此,该生成类中有一个 private 的 padding 属性。 可见跟上面手写的 SumClass 类实现几乎完全一致。
4. std::function
C++ 对 std::function 的描述:
Class template
std::functionis a general-purpose polymorphic function wrapper
Instances of
std::functioncan store, copy, and invoke any CopyConstructible Callable target–functions, lambda expressions, bind expressions, or other function objects, as well as pointers to member functions and pointers to data members
std::function 是一个函数包装器模板,一个 std::function 类型对象可以包装以下类型:
- 函数指针
- 类成员函数指针 (如使用
std::bind传递) - 函数对象(定义了
operator()操作符的类对象)
既然能包装这些类型, 也相当于可以从这些类型转换过来:
1 | class TestClass { |
5. 相互转换
- 4 中提到的都可以转换为
std::function - 没有什么可以直接转换为
lambda - 一个没有捕获变量的
lambda函数, 可以显式转换成函数指针:
1 | // lambda without capturing any value -> function ptr |
- Title: 函数指针、函数对象、lambda 表达式、std::function
- Author: Xueshi
- Created at : 2022-02-05 00:59:10
- Updated at : 2026-06-07 01:44:22
- Link: http://xueshi.me/2022/02/05/C-FUNCTION-LAMBDA/
- License: This work is licensed under CC BY-NC-SA 4.0.