函数指针直接指向函数,而函数对象重载了 operator() 运算符以实现可调用。两者都是 c++++ 函数调用的有用工具,函数指针高效且无状态,函数对象低效但可带状态。在实战中,函数指针常用于排序函数,函数对象则适用于自定义比较函数。

C++ 函数指针和函数对象的区别与联系
简介
函数指针和函数对象是 C++ 中实现面向对象编程的两个重要工具。它们都用于调用函数,但工作方式和用途不同。
立即学习“C++免费学习笔记(深入)”;
函数指针
函数指针是保存函数地址的变量。它就像一个指向函数的指针。要调用指向函数的函数指针,只需对其进行解引用即可。
语法:
|
1
2
3
4
5
6
7
8
|
typedef int (*FunctionPointer)(int);
FunctionPointer funcPtr = &myFunction;
int result = funcPtr(arg);
|
函数对象
函数对象是一个可调用的类,它重载了 operator() 运算符。函数对象类似于函数,可以传递参数并返回结果。
语法:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class MyFunctionObject {
public:
int operator()(int arg) {
return arg * 2;
}
};
MyFunctionObject funcObj;
int result = funcObj(arg);
|
区别
| 特征 |
函数指针 |
函数对象 |
| 语法 |
指向了函数 |
重载了 operator() 运算符 |
| 类型 |
裸指针 |
类 |
| 效率 |
高效 |
低效 |
| 状态 |
无状态 |
可以有状态 |
联系
虽然函数指针和函数对象的工作方式不同,但它们都是对 C++ 中函数调用的有用的补充。函数指针非常适合低级编程任务,而函数对象则更适合面向对象编程。
实战案例
排序函数中的函数指针:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <algorithm>
bool comparedescending(int a, int b) {
return a > b;
}
int main() {
std::vector<int> nums = {1, 3, 5, 2, 4};
std::sort(nums.begin(), nums.end(), compareDescending);
for (auto num : nums) {
std::cout << num << " ";
}
}
|
自定义比较函数中的函数对象:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class DescendingComparator {
public:
bool operator()(int a, int b) const {
return a > b;
}
};
int main() {
std::vector<int> nums = {1, 3, 5, 2, 4};
std::sort(nums.begin(), nums.end(), DescendingComparator());
for (auto num : nums) {
std::cout << num << " ";
}
}
|