参考一:
函数对象(也称“算符”)是重载了“()”操作符的普通类对象。因此从语法上讲,函数对象与普通的函数行为类似。
用函数对象代替函数指针有几个优点:
1. 首先,因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。在使用普通函数时需要将先前调用的结果存储在全局或者本地静态变量中,但是全局或者本地静态变量有某些我们不愿意看到的缺陷。
2. 其次,在函数对象中编译器能实现内联调用(编译器能内联重载的操作符代码,所以就避免了与函数调用相关的运行时问题),从而更进一步增强了性能。这在函数指针中几乎是不可能实现的。
3. 模板函数对象: 增加函数对象的通用性。
参考二:
C++函数对象实质上是一个实现了operator()--括号操作符--的类。
函数对象可以携带附加数据,而指针就不行了。
另外,C++函数对象还有一个函数指针无法匹敌的用法:可以用来封装类成员函数指针!因为函数对象可以携带附加数据,而成员函数指针缺少一个类实体(类实例)指针来调用,因此,可以把类实体指针给函数对象保存起来,就可以用于调用对应类实体成员函数了。
template<typename O>
class memfun
{
public:
memfun(void(O::*f)(const char*), O* o): pFunc(f), pObj(o){}
void operator()(const char* name)
{
(pObj->*pFunc)(name);
}
private:
void(O::*pFunc)(const char*);
O* pObj;
};
class A
{
public:
void doIt(const char* name) { cout << "Hello " << name << "!";}
};
A a;
memfun<A> call(&A::doIt, &a); // 保存 a::doIt指针以便调用
call("Kitty"); // 输出 Hello Kitty!
参考三:
函数对象(function object),又名仿函数(functor),是重载了operator()的一个类,其实在stl算法中有大量运用,c++标准预定义的如 less <>,greater <>,bind2nd <>等
为什么引入仿函数?
原因:
1.仿函数有具体型别,可用在模板参数,而函数不行。
2.同类仿函数可有不同值,可代表不同状态,比函数灵活(须定义多个)。
3.仿函数可能比普通函数快。
不要以为函数对象的频繁调用会使程序性能大大折扣,大量事实和实验证明,正确使用函数对象的程序要比其他程序性能快很多!