学习《C++ Primer》的笔记

函数指针的一种替代策略是Function object(函数对象)。

函数对象与函数指针相比较有两个方面的优点:首先如果被重载的调用操作符是inline函数则编译器能够执行内联编译,提供可能的性能好处;其次函数对象可以拥有任意数目的额外数据,用这些数据可以缓冲结果,也可以缓冲有助于当前操作的数据。

函数对象是一个类,它重载了函数调用操作符operator() ,该操作符封装了一个函数的功能。典型情况下函数对象被作为实参传递给泛型算法,当然我们也可以定义独立的函数对象实例。

来看一个例子:

#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
class Sum {
int val;
public:
Sum(int i) :val(i) { }

//当在需要int的地方,Sum将自动转换为int类型
//这里是为了方便cout<<Sum的实例;
operator int() const { return val; }

//写在类中的函数代码一般默认为内联代码
int operator()(int i) { return val+=i; }
};

void f(vector<int> v)
{
Sum s = 0; //Sum s = 0等价于Sum s(0),不等价于Sum s;s = 0;

//对vector<int>中的元素求和
//函数对象被作为实参传递给泛型算法
s = for_each(v.begin(), v.end(), s);

cout << "the sum is " << s << "\n";

//更简单的写法,定义独立的函数对象实例
cout << "the sum is " << for_each(v.begin(), v.end(), Sum(0)) << "\n";
}


int main()
{
vector<int> v;
v.push_back(3); v.push_back(2); v.push_back(1);
f(v);
system("pause");
return 0;
}
posted on 2005-12-01 20:14 张沈鹏 阅读(861) 评论(9)  编辑 收藏 引用
Comments
  • # re: Function object(函数对象)
    味全每日C++
    Posted @ 2005-12-01 21:21
    Sum s = 0;//(为什么可以用s = 0来初始化?没有重载 operator=啊!!!)
    这里是因为类自动生成的赋值函数吧..  回复  更多评论   
  • # re: Function object(函数对象)
    c++基础
    Posted @ 2005-12-01 22:19
    Sum s = 0;
    等同于
    Sum s(0);

    Sum s = 0;
    s = 0;
    两个=含义不同  回复  更多评论   
  • # re: Function object(函数对象)
    c++基础
    Posted @ 2005-12-01 22:38
    to 楼上:
    不是什么拷贝构造函数,只是普通的带参数的构造函数

    口误吧,呵呵  回复  更多评论   
  • # re: Function object(函数对象)
    力为
    Posted @ 2005-12-01 22:54
    Sum s = 0;//(为什么可以用s = 0来初始化?)
    这个确实是C++的基本问题,没有弄懂这个问题,可以说是C++小学水平的。
    读了《Effective C++》的都应该知道的吧。:)  回复  更多评论   
  • # re: Function object(函数对象)
    joyfire
    Posted @ 2005-12-01 23:09
    没有必要因为一点小问题打击人家。C++博大精深,谁能有把握说自己完全掌握。学习的兴趣和行动比什么都重要。我从zuroc的blog学到了不少东西。  回复  更多评论   
  • # re: Function object(函数对象)
    张沈鹏
    Posted @ 2005-12-01 23:52
    学习C++中,我刚大二,并且专业也和编程关系不大,水平很浅,见笑了。。。。。。。  回复  更多评论   
  • # re: Function object(函数对象)
    放屁阿狗
    Posted @ 2005-12-07 22:53
    看看 bind2nd就明白了,其实c++的东西没有直接看代码来的体会直接和深刻  回复  更多评论   
  • # re: Function object(函数对象)
    simida
    Posted @ 2006-11-16 14:48
    why Sum s = 0?
    先调用 Sum(int i) 构建临时对象 temp(0).然后调用拷贝构造函数?
    还是 直接让s指向temp(0)?

      回复  更多评论   
  • # re: Function object(函数对象)
    张沈鹏
    Posted @ 2006-11-16 16:00
    隐式类转换
    c++ primer上有的  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理