C++ 什么是仿函数 ?什么是函数对象?

sumu · 2019年08月10日 · 64 次阅读

什么是仿函数,什么是函数对象❓

首先说什么是函数对象(function object),重载调用操作符()的类,其对象常称为函数对象(function object),这样也就很清楚的说明了函数对象首先他是个对象,其次是它重载了()函数运算符,从而可以让它使用起来像一个函数。即它们是行为类似函数的对象。又称仿函数。

例如如下定义了一个两个int类型的数字比较函数对象,在调用过程中直接cmp(5,7);就和函数调用一样。

#include<iostream>

class Cmp{
public:
    bool operator ()(int x,int y){
        return x>y;
    }
};

int main(){
    Cmp cmp;
    std::cout<<cmp(5,7);
    return 0;
}

那你肯定会疑问?既然和函数一样,我直接定义个函数不就行了吗?为什么非要设计个函数对象类呢? 是的单单就一个函数的话确实体现不出来函数对象的便利之处,那我再提出一个需求,就是我想知道cmp()这个函数调用次数,那你肯定会说简单呀,直接在cmp()函数中做一个全局变量或者静态变量的自增不就行了么,是的这样也确实解决了这个问题。但是用函数对象的话,就简单了,因为函数对象是个对象,可以有自己的成员变量,从而函数对象可以有成员变量来保存当前的状态,而函数只能借助全局变量和静态变量来实现。如果这个时候你要实现加函数、减函数、比较函数....等函数的调用次数,设计成函数的话,就得定义许多个全局或者静态变量了,这样可维护性/可读性就不好了,要记住c++是一个面向对象的语言!!!

函数对象的优点💯

  • 1)函数对象比一般的函数灵活。可以附加信息和保存状态。
  • 2)仿函数有类型识别,可以作为模板参数。
  • 3)执行速度上函数对象速度可以更快,函数对象通过重载()实现,那么将operator()函数设置为内联函数,可以提高程序的运行速度。
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册