介绍
这篇文章给大家介绍一文读懂c++中的函数对象,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。
下面是一个函数对象的例子。
# include & lt; iostream> using namespace 性传播疾病; class CAverage { 公众: double 才能操作符()(a1, int int a2, int a3) ,,{//重载()运算符 ,,,return (二)(时间+ a1 a2 +, a3),/, 3; ,,} }; int main () { CAverage 才能;平均,//能够求三个整数平均数的函数对象 cout 才能;& lt; & lt;,平均(3,,2,,3);,//等价于,cout & lt; & lt;, average.operator (3,, 2,, 3); return 才能;0; }
程序的输出结果是:
引用>
2。66667年()是目数不限的运算符,因此重载为成员函数时,有多少个参数都可以。
平均是一个对象,平均(3 2 3)实际上就是平均水平。运营商(3、2、3),这使平均看得上去像函数的名字,故称其为函数对象。
函数对象应用实例1:在积累算法中的应用
STL中有以下实现“累”加功能的算法(函数模板):
template & lt; class InIt,, class T, class Pred> T 积累(InIt 首先,,InIt 最后,T val,, Pred 凤凰社);该模板的功能是对[第一,去年)中的每个迭代器我执行val=op (val, *我),返回最终的val。在Dev c++中,数字头文件中积累的源代码如下:
template & lt; class InIt,, class T, class Pred> 首先,T 积累(InIt InIt 最后,T init,, Pred 凤凰社) { for 才能;(,first !=,最后,,+ +) ,,,init =, op (init,, *第一); return 才能;初始化; };此模板被实例化后,op (init, *第一)必须要有定义,则op只能是函数指针或者函数对象。因此调用该accmulate模板时,形参op对应的实参只能是函数名,函数指针或者函数对象。
下面的程序通过积累模板求一个向量中元素的平方和,其中用到了函数对象。
# include & lt; iostream> # include & lt; vector> # include & lt; numeric>,//accumulate 在此头文件定义 using namespace 性传播疾病; template & lt; class T> 首先,void PrintInterval (T T 最后) {,//输出区间[第一,去年)中的元素 for 才能;(,first !=,最后,,+ +) ,,,cout & lt; & lt;, * first & lt; & lt;,,,,, cout 才能;& lt; & lt;, endl; } int SumSquares (int 总,int 价值) { return 才能;total  +, value *,价值; } templateclass SumPowers { 私人: int 才能;权力; 公众: SumPowers才能(int p),:功率(p), {,} const 才能;T 操作符(),(const T ,,,, const T ,,值) ,,{//计算,值的幂次方,加到总上 ,,,T v =,价值; ,,,for (int 小姐:=,0;,小姐:& lt;, power 作用;1;,+ + i) ,,,,,v =, v *,价值; ,,,return total +, v; ,,} }; int main () { const 才能int SIZE =, 10; int 才能a1 [],=, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,}; vector<才能;int>, v (a1,, a1 +,大小); cout 才能;& lt; & lt;,“1),“;, PrintInterval(逆序函数(),,v.end ()); int 才能;result =,积累(逆序函数(),,v.end (),, 0,, SumSquares); cout 才能;& lt; & lt;,“2),平方和:“,& lt; & lt;, result & lt; & lt;, endl; result =,才能积累(逆序函数(),,v.end (),, 0,, SumPowers (3)); cout 才能;& lt; & lt;,“3),立方和:“,& lt; & lt;, result & lt; & lt;, endl; result =,才能积累(逆序函数(),,v.end (),, 0,, SumPowers (4)); cout 才能;& lt; & lt;,“4), 4次方和:“,& lt; & lt;,结果; return 才能;0; } 程序的输出结果如下:
引用>
1) 1 2 3 4 5 6 7 8 9 10
2)平方和:385
3)立方和3025
4) 4次方和:25333第37行,第四个参数是SumSquares函数的名字。函数名字的类型是函数指针,因此本行将积累模板实例化后得到的模板函数定义如下:
一文读懂c++中的函数对象