• 函数对象分析


    首先我们看我们接到的一个用户需求:

    编写一个函数:

      -函数可以获得斐波那契数列每项的值

      -没调用一次返回一个值。

      -函数可以重复使用根据需要。

    1 for(int i = 0; i<10; i++)
    2 {
    3     cout <<fib() << endl;
    4 }

    比如斐波那契函数,第一二次调用返回1 三次调用返回2,四次返回3。。

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 int fib()
     7 {
     8     static int a0 = 0;
     9     static int a1 = 1;
    10     
    11     int ret = a1;
    12     
    13     a1 = a0 + a1;
    14     a0 = ret;
    15     
    16     return ret;
    17 }
    18 
    19 
    20 int main()
    21 {
    22     for(int i=0; i<10; i++)
    23     {
    24         cout << fib() << endl;
    25     }
    26     
    27     cout << endl;
    28     
    29     for(int i=0; i<5; i++)
    30     {
    31         cout << fib() << endl;
    32     }
    33     
    34     return 0;
    35 }

    这段代码我们发现初步满足需要,但客户说我们的不满足需求;

    他说:我们这段代码一旦开始就无法重来了。那如果我们定义一个全局变量来redefine可以吗?理论上可以,但客户说的是一个函数,这就不满足客户的需要了,头疼,我怎么做呢?

    解决方案:

      -使用具体的类对象取代函数;

      -该类的对象具备函数调用的行为;

      -构造函数指定具体的数列项的起始地址;

      -多个对象相互独立的求解数列项。

    函数对象:

    -函数调用操作符()

      -只能通过类的成员函数重载

      -可以定义不同参数的多个重载函数。

    最终解决方案.cpp:

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 class Fib
     7 {
     8     int a0;
     9     int a1;
    10 public:
    11     Fib()
    12     {
    13         a0 = 0;
    14         a1 = 1;
    15     }
    16     
    17     Fib(int n)
    18     {
    19         a0 = 0;
    20         a1 = 1;
    21         
    22         for(int i=2; i<=n; i++)
    23         {
    24             int t = a1;
    25             
    26             a1 = a0 + a1;
    27             a0 = t;
    28         }
    29     }
    30     
    31     int operator () ()
    32     {
    33         int ret = a1;
    34     
    35         a1 = a0 + a1;
    36         a0 = ret;
    37         
    38         return ret;
    39     }
    40 };
    41 
    42 int main()
    43 {
    44     Fib fib;
    45     
    46     for(int i=0; i<10; i++)
    47     {
    48         cout << fib() << endl;
    49     }
    50     
    51     cout << endl;
    52     
    53     for(int i=0; i<5; i++)
    54     {
    55         cout << fib() << endl;
    56     }
    57     
    58     cout << endl;
    59     
    60     Fib fib2(10);
    61     
    62     for(int i=0; i<5; i++)
    63     {
    64         cout << fib2() << endl;
    65     }
    66     
    67     return 0;
    68 }

    小结:

      -函数调用操作符(())是可重载的

      -函数调用操作符只能通过类的成员函数重载

      -函数调用操作符可以定义不同参数的多个重载函数

      -函数对象用于在工程中取代函数指针。

  • 相关阅读:
    值币转换编程总结
    打印沙漏编程总结
    Leetcode每日一题 面试题 17.21. 直方图的水量
    VS2017-OPENGL配置glfw+glad
    OpenGL(二) 绘制一个三角形
    OpenGL(一) 渲染循环创建窗口
    Leetcode每日一题 1006.笨阶乘
    Leetcode每日一题 90.子集 II
    Leetcode每日一题 190.颠倒二进制位
    Leetcode 第243场周赛 创新奇智&力扣
  • 原文地址:https://www.cnblogs.com/lemaden/p/10121688.html
Copyright © 2020-2023  润新知