[C++基础之十九]函数对象

2014-11-24 03:33:40 · 作者: · 浏览: 2

函数指针倒是蛮常见的,这函数对象又是什么呢?什么时候会用到函数对象?

1.什么是函数对象

函数对象就是定义了函数调用操作符,也就是operate()的对象。因此我们可以在定义函数调用操作符的时候,实现所需的函数功能。

2.示例

如上,其实最主要的还是operate()的定义,这和普通运算符的重载是一样的。

[cpp]
  1. template
  2. class Max
  3. {
  4. public:
  5. T operator()(T a, T b){ return a>b a:b;}
  6. };
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9. Max intMax;
  10. cout< cout< }
    (1)程序定义了一个Max类(这里用了模版),重载了函数调用符,实现了函数功能:返回一个最大值。

    (2)主函数中定义了一个Max类的对象,intMax,也就是函数对象。

    (3)对函数调用符的使用,可以直接用括号,也可以用operate+括号的形式(从本质上来说,这是一个特殊的成员函数)。这和普通运算符的重载也是一样的。

    3.什么时候用函数对象?

    看了上面是例子,可能感觉怪怪的,明明一个函数就能搞定的事,为什么要搞个函数对象出来,函数对象到底用在哪?

    正是因为函数对象是一个对象,所以它可以封装一些属性,比如函数调用的一些状态数据等等,而函数本身没有记忆功能,从这方面而言,函数比起函数对象弱爆了。函数对象就可以帮我们记住函数做了什么。

    再看一个例子。

    [cpp]
    1. //定义学生类,重载了输出操作符
    2. class Student
    3. {
    4. public:
    5. Student(string strName):name(strName){}
    6. friend ostream& operator<< (ostream& out, const Student& stu);
    7. private:
    8. string name;
    9. };
    10. ostream& operator<< (ostream& out, const Student& stu){out<
    11. //定义点名类,定义调用操作符实现点名功能,同时保存学生人数
    12. template
    13. class NumberOff
    14. {
    15. public:
    16. NumberOff():m_count(0){}
    17. void operator()(const T& t)
    18. {
    19. cout< m_count++;
    20. }
    21. int GetCount() const {return m_count;}
    22. private:
    23. int m_count;
    24. };
    25. int _tmain(int argc, _TCHAR* argv[])
    26. {
    27. NumberOff numberoff;//创建函数对象
    28. Student stu1(Jacky1);//创建Student对象
    29. Student stu2(Jacky2);
    30. Student stu3(Jacky3);
    31. numberoff(stu1);//点名
    32. numberoff(stu2);
    33. numberoff(stu3);
    34. cout< }

      输出:

      Jacky1
      Jacky2
      Jacky3
      Total 3

      这样一来函数对象numberoff中的m_count就帮我们记住了函数调用的次数,也就是已点名学生的人数,就单这个例子而言完全可以写出一个更好的实现,这里举此例主要用于体现函数对象的优势。