Loading... 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。 <span style="color:#A52A2A">注意:</span> 1. 函数对象(仿函数)是一个类,不是一个函数。 2. 函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。 分类:假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为<span style="color:#A52A2A">“一元仿函数”(unary functor)</span>;相反,如果重载的operator()要求获取两个参数,就将这个类称为<span style="color:#A52A2A">“二元仿函数”(binary functor)</span>。 函数对象的作用: STL提供的算法往往都有两个版本,其中一个版本表现出最常用的某种运算,另一版本则允许用户通过template参数的形式来指定所要采取的策略。 ```C++ #include<iostream> using namespace std; class MyPrint { public: void operator()(int num) { cout << num << endl;//输出 m_Count++;//统计累加 } /*状态*/ int m_Count = 0;//统计 }; void doWork(MyPrint mp, int num) { mp(num); } int main() { //1、函数对象 很像函数调用方式,因此也成为仿函数 MyPrint mp; mp(100);//类似函数的调用 //2、函数对象 超出普通函数的概念,内部可以有自己的状态 mp(1); mp(3); mp(1); mp(4); mp(520); //我们现在统计仿函数被调用过几次 cout << "count = " << mp.m_Count << endl; //3、函数对象可以作为函数的参数传递 doWork(MyPrint(), 1000); return 0; } ``` ![](https://blog.fivk.cn/usr/uploads/2021/04/1362215509.png) 总结: 1. 函数对象通常不定义构造函数和析构函数,所以在构造和析构时不会发生任何问题,避免了函数调用的运行时问题。 2. 函数对象超出普通函数的概念,函数对象可以有自己的状态 3. 函数对象可内联编译,性能好。用函数指针几乎不可能 4. 模版函数对象使函数对象具有通用性,这也是它的优势之一 最后修改:2021 年 04 月 20 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏