函数指针和函数对象

Posted larry-xia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针和函数对象相关的知识,希望对你有一定的参考价值。

函数指针

从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。

void bar(char ch, int i)
{
        cout << "bar " << ch <<   << i << endl;
}
void (*pBar)(char,int);   //定义一个指针变量
pBar=bar; //指针变量赋值
(*pBar)(H,3);   //或者pBar(‘H‘,3);
使用typedef更加方便
形式1:typedef  返回类型(*新类型)(参数表)
typedef void (*PFT)(char,int);   //定义了一种PFT的类型,并定义这种类型为指向某种函数的指针
PFT pft=bar; //定义指针变量pft并赋值
pft(H,3);

使用函数指针作为函数参数

void foo(char ch,int i,PFT pf)
{
    pf(ch,i);
}
PFT pft = bar; //定义函数指针变量
foo(H, 91, pft);
函数对象
从一般的函数回调意义上来说,函数对象和函数指针是相同的,但是函数对象却具有许多函数指针不具有的特点,函数对象使程序设计更加灵活,而且能够实现函数的内联(inline)调用,使整个程序实现性能加速。
函数对象:这里已经说明了这是一个对象,而且实际上只是这个对象具有函数的某些功能,我们才称之为函数对象,如何使对象具有函数功能呢,很简单,只需要为这个对象的操作符()进行重载就可以了,如下:
class A{
public:
int operator()(int x){return x;}
};
A a;
a(5);

使用函数对象作为函数参数

可以在函数形参列表中调用函数对象,它完全可以取代函数指针!
当我们想在形参列表中调用某个函数时,可以先声明一个具有这种函数功能的函数对象,然后在形参中使用这个对象,他所作的功能和函数指针所作的功能是相同的,而且更加安全。
技术分享图片
 1 class Func
 2 {
 3 public:
 4         int operator()(int a, int b)
 5         {
 6                int res = a + b;
 7                cout << a << "+" << b << "="<<res<< endl;
 8                return res;
 9         }
10 };
11 int addFunc(int a, int b, Func& func)
12 {
13         return func(a, b);
14 }
15 int main()
16 {
17         Func func;
18         int res = addFunc(2, 3, func);
19         cout << res << endl;
20         system("pause");
21         return 0;
22 }
View Code

使用模板

技术分享图片
 1 class FuncT
 2 {
 3 public:
 4         template <typename T>
 5         T operator()(T a, T b)
 6         {
 7                T res = a + b;
 8                cout << a << "+" << b << "=" << res << endl;
 9                return res;
10         }
11 };
12 template <typename T>
13 T addFuncT(T t1, T t2, FuncT& funct)
14 {
15         return funct(t1, t2);
16 }
17 int main()
18 {
19         FuncT funct;
20         addFuncT<double>(2.4, 3.67, funct);
21         system("pause");
22         return 0;
23 }
View Code

 

以上是关于函数指针和函数对象的主要内容,如果未能解决你的问题,请参考以下文章

函数是对象,函数名值指针

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

更新:C++ 指针片段

函数对象和函数指针

函数指针和函数对象

C++中的函数指针和函数对象总结