Ex11_6.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:1k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //【例11.6】求和函数对象的定义和测试。
  2. #include<iostream>
  3. using namespace std;
  4. template<typename T>class Sum{
  5. T res;
  6. public:
  7. Sum(T i=0):res(i){} //构造函数,即Sum(T i=0){res=i;}
  8. T operator()(T x){  //累加,重载的调用操作符()
  9. res+=x;
  10. return res;
  11. }
  12. };
  13. template<typename FuncObject,typename T>
  14. T Func1(FuncObject fob,const T &val){  //函数对象作为参数
  15. return fob(val);                       //调用重载的(),实现加法
  16. }  
  17. template<typename FuncObject,typename T>
  18. T Func2(FuncObject &fob,const T &val){  //参数为引用,建议用此方式
  19. return fob(val);
  20. int main(){
  21. Sum<int> sum(10);                  //调用构造函数建立sum。res值为10
  22. int i=5,j=10;
  23. cout<<sum(j)<<'t'<<sum(i)<<endl;  //调用重载的(),实现累加,输出:20  25
  24. cout<<Func1(sum,i)<<'t';  
  25.     //Func1参数传值,sum::res保持25,在一份拷贝上完成sum+i,输出:30
  26. cout<<Func1(sum,j)<<endl;        //在一份拷贝上完成sum+j,未实现累加,输出:35
  27. cout<<Func2(sum,i)<<'t';
  28.     //Func2参数为引用,在原sum上完成sum=sum+i,实现累加,输出:30
  29. cout<<Func2(sum,j)<<endl;            //完成sum=sum+j,实现累加,输出:40
  30.     //以下为函数对象标准用法,每次新建函数对象,Func1和Func2结果无差别
  31. cout<<Func1(Sum<int>(5),i)<<'t';     // 5+i,输出:10  
  32. cout<<Func2(Sum<int>(),j)<<endl;      // 0+j,输出:10
  33. return 0;
  34. }