函数指针与仿函数
原创
©著作权归作者所有:来自51CTO博客作者honeyR的原创作品,请联系作者获取转载授权,否则将追究法律责任
函数指针
在平常的C/C++代码编程中, 我们经常会碰到函数指针(Function Pointer)这个概念,函数指针,顾名思义,指向函数入口的指针。
像我们平常使用的指向数组的指针,我们可以传递数组的地址。函数指针也一样,我们用代码演示一下具体用法:
#include<iostream>
using namespace std;
typedef void(*func)(int);
void print(int value)
{
printf("%d ", value);
}
void add(int &sum, int index, func pFunc)
{
sum += index;
pFunc(sum);
}
int main(void)
{
int sum = 0;
for (int i = 0; i < 10; i++)
{
add(sum, i, print);
}
system("pause");
return 0;
}
我们可以将一个函数名作为一个参数传递。
仿函数
在《C++标准程序库》一书中对仿函数的解释是:任何东西,只要其行为像函数,就可以称之为仿函数。
那么仿函数到底是什么呢?
想一下,我们平常调用函数少不了的是什么?
函数行为,是指可以使用小括号传送参数,调用某个东西
所以只要我们定义的对象可以有这种行为就可以了,因此我们要成为仿函数,就必须要重载()操作符,以让对象的行为像函数。一个对象,具备像函数一样的行为, 就称为函数对象。
将上面的代码改为用函数对象的形式:
#include<iostream>
using namespace std;
class MyPrint
{
public:
void operator()(int value) const
{
printf("%d ", value);
}
};
void add(int &sum, int index, MyPrint &pFunc)
{
sum += index;
pFunc(sum);
}
int main(void)
{
int sum = 0;
MyPrint print;
for (int i = 0; i < 10; i++)
{
add(sum, i, print);
}
system("pause");
return 0;
}
函数指针与仿函数的区别
一个类,是数据以及对数据操作的行为的集合,而我们现在的函数对象,只拥有方法,而没有使用它的数据,但是在函数指针,是无法保存数据的,所以,函数对象比函数指针功能更强,因为它可以保存数据,这一特性,是函数指针无法比拟的优势。