浅析C++函数指针和函数对象

来源:互联网 发布:江苏卫视网络在线直播 编辑:程序博客网 时间:2024/06/07 15:13

C/C++代码中常见函数指针的使用,C++中经常碰到函数对象这种用法,在此简单总结。

1.函数指针

函数指针(function pointer)就是指向某函数的指针变量,即指向所谓的函数入口地址。函数指针的基本作用就是调用函数,另一重要作用是作函数的参数

函数指针的声明:返回值类型 ( * 指针变量名) ([形参列表]);
注意  ( * 指针变量名)  的括号不可省略,它能告诉编译器声明的为一个函数指针而不是返回值为指针类型的函数。
例如一个普通函数声明为:int func(int a);   函数指针声明方法为:int (*func) (int a);
简单起见可用typedef声明为:typedef int (*func) (int a); 直接使用 func f; 便可定义一个函数指针

举例1:调用函数
typedef void (*func) (int a);void foo(int a){    std::cout << a << std::endl;}int main(){     func f = foo;    f(1);    return 0;}


举例2:作函数的参数
typedef int (*add) (int a, int b);int foo(int a, int b){    return a + b;}void bar(int a, int b, add f){    std::cout << f(a, b) << std::endl;}int main(){    add f = foo;    bar(1, 2, f);    return 0;}


2.函数对象

函数对象(function object),又称仿函数(functor),是C++相较于C的一大特性。顾名思义,函数对象首先是一个对象,其特点是重载了()运算符,该对象有了某个函数的功能。从功能上来说函数对象和函数指针的作用基本相同,但前者能使程序设计更加灵活高效,完全可以取代函数指针。

例如定义一个简单的函数对象:
class FuncObj{public:    void operator () ()    {        std::cout << "hello\n";    }};int main(){    FuncObj a;    a();//FuncObj类重载了()操作符,因此可像调用普通函数一样调用对象    return 0;}

举例1:函数对象作函数的参数
class FuncObj{public:    int operator() (int a, int b)    {        return a + b;    }};void foo(int a, int b, FuncObj& f){    std::cout << f(a, b) << std::endl;}int main(){    FuncObj f;    foo(1, 2, f);    return 0;}

举例2:函数模板类(泛型)
class FuncObj{public:    template <class T>    T operator() (T a, T b)    {        return a + b;    }};template <class T>void foo(T a, T b, FuncObj& f){    std::cout << f(a, b) << std::endl;}int main(){    FuncObj f;    foo(1, 2, f);    foo(3.14, 2.72, f);    return 0;}
此类技术在STL中得到广泛应用。


应用:STL priority_queue自定义比较类
struct Node  {      int n;      Node(int _n):n(_n){}  };  //自定义比较类  struct cmp  {      bool operator() (const Node &a, const Node &b)      {          return a.n > b.n;      }  };  int main()  {      //声明一个优先队列pq      priority_queue<Node, vector<Node>, cmp> pq;  }