25 函数对象分析

1 需求

  • 编写一个函数

    • 函数可以获得斐波那契数列每项的值
    • 每调用一次返回一个值
    • 函数可根据需要重复使用
    for(int i = 0; i < 10; ++i)
    {
        cout << fib() << endl;
    }
    

2 解决方案

  • 第一个解决方案

    • Demo

      #include <iostream>
      #include <string>
      
      using namespace std;
      
      // 带状态的函数
      int fib()
      {
          static int a0 = 0;
          static int a1 = 1;
          
          int ret = a1;
          
          a1 = a0 + a1;
          a0 = ret;
          
          return ret;
      }
      
      
      int main()
      {
          for(int i = 0; i < 10; i++)
          {
              cout << fib() << endl;
          }
          
          cout << endl;
          
          for(int i = 0; i < 5; i++)
          {
              cout << fib() << endl;
          }
          
          return 0;
      }
      
    • 编译运行

      1
      1
      2
      3
      5
      8
      13
      21
      34
      55
      
      89
      144
      233
      377
      610
      
  • 存在的问题

    • 函数一旦开始调用就无法重来
      • 静态局部变量处于函数内部,外界无法改变
      • 函数为全局函数,是唯一的,无法多次独立使用
      • 无法指定某个具体的数列项作为初始值
  • 解决方案

    • 使用具体的类对象取代函数
    • 该类的对象具备函数调用的行为
    • 构造函数指定具体数列项的起始位置
    • 多个对象相互独立的求解数列项

3 函数对象

  • 函数调用操作符(()

    • 只能通过类的成员函数重载
    • 可以定义不同参数的多个重载函数
  • 函数对象用于在工程中取代函数指针

  • 最终的解决方案

    • Demo

      #include <iostream>
      #include <string>
      
      using namespace std;
      
      class Fib
      {
          int a0;
          int a1;
      public:
          Fib() {
              a0 = 0;
              a1 = 1;
          }
          
          Fib(int n) {
              a0 = 0;
              a1 = 1;
              
              for(int i = 2; i <= n; i++) {
                  int t = a1;          
                  a1 = a0 + a1;
                  a0 = t;
              }
          }
          
          //操作符重载函数
          int operator () () {
              int ret = a1;
              a1 = a0 + a1;
              a0 = ret;
              
              return ret;
          }
      };
      
      int main()
      {
          Fib fib;
          
          for(int i = 0; i < 10; i++)
          {
              cout << fib() << endl;
          }
          
          cout << endl;
          
          for(int i = 0; i < 5; i++)
          {
              cout << fib() << endl;
          }
          
          cout << endl;
          
          //指定从第10项开始
          Fib fib2(10);
          
          for(int i = 0; i < 5; i++)
          {
              cout << fib2() << endl;
          }
          
          return 0;
      }
      
    • 编译运行

      1
      1
      2
      3
      5
      8
      13
      21
      34
      55
      
      89
      144
      233
      377
      610
      
      55
      89
      144
      233
      377
      
posted @ 2020-10-30 19:28  nxgy  阅读(71)  评论(0编辑  收藏  举报