zoukankan      html  css  js  c++  java
  • 函数对象分析

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

    编写一个函数:

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

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

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

    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 }

    小结:

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

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

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

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

  • 相关阅读:
    asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用
    asp.net core系列 75 Elasticsearch与中文分词配置
    asp.net core系列 74 Exceptionless服务端安装
    nginx for windows
    asp.net core系列 73 Exceptionless+Nlog以及Apollo介绍
    asp.net core系列 72 Exceptionless使用介绍
    asp.net core系列 71 Web架构分层指南
    asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅
    asp.net core系列 69 Amazon S3 资源文件上传示例
    asp.net core系列 68 Filter管道过滤器
  • 原文地址:https://www.cnblogs.com/lemaden/p/10121688.html
Copyright © 2011-2022 走看看