函数对象分析

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

编写一个函数:

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

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

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

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 }

 

小结:

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

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

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

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

 

posted @ 2018-12-14 21:05  lemaden  阅读(152)  评论(0编辑  收藏  举报