一文读懂c++中的函数对象

  介绍

这篇文章给大家介绍一文读懂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  *,价值;   }   template   class  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++中的函数对象