函数指针

在平常的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;
}

函数指针与仿函数的区别

一个类,是数据以及对数据操作的行为的集合,而我们现在的函数对象,只拥有方法,而没有使用它的数据,但是在函数指针,是无法保存数据的,所以,函数对象比函数指针功能更强,因为它可以保存数据,这一特性,是函数指针无法比拟的优势。