c++ - 函数对象优于函数指针

来源:互联网 发布:java毕业项目源代码 编辑:程序博客网 时间:2024/05/18 14:43

函数往往需要一些数据才能工作,但一个函数指针没有相关联的数据。使用全局变量?有没有更好的办法?

 

函数对象就是重载了operator()的类的对象。它的优势在于,在函数调用之间保持状态或者将状态信息传递给函数的时候,每个对象有自己的信息,不必求助于全局或局部静态变量以及一些“卑鄙的”花招。即,函数对象既保持了函数指针的灵活性,又封装了数据,保证了他们的安全性。

此外,通过创建一个带有虚拟operator()的函数对象的层次结构,可以获得虚函数指针的效果--动态行为。

 

函数对象还可以封装非成员函数的Func类型以及成员函数。以封装成员函数为例:

 

class Func{

public:

   virtual ~Func();

   virtual double operator()(double)=0;

};

double integrate (Func &f, double low, double hight);

 

 

template <class C>

class MFunc : public Func{

  public:

      MFunc( C & obj, double (C::*f) (double) )

              : obj_(obj), f_(f) {}

      double operator () (double d)

              { return (obj_.*f) (d); }

  private:

     C & obj_;

     double (C::*f_)(double);

}

 

//...

AClass anObj;

MFunc<AClass> f( anObj, & AClass::aFunc);

double area = integrate (f, 0.0, 2.718);

 

=======================

说说另外一个类似的话题 --

STL函数对象

使用函数对象作为比较器还有一个额外的好处,就是比较操作将被内联处理,而使用函数指针则不允许内联。

用作STL比较器的函数对象一般都很小巧、简单而且快速。一般没有数据成员、没有虚函数、没有显式声明的构造函数和析构函数,且对调用的重载是内联的。

当与STL协同使用时,在函数对象中避免(或尽量少)使用数据成员的另一个原因在于,STL实现可能会为一个函数对象产生若干份复制,而且假定所有这些复制都是一致的。为了确保一个对象的所有复制一致,最简单的方式就是不要让对象带有任何数据成员。

原创粉丝点击