函数对象分析

函数对象分析
1.客户需求
编写一个函数,函数可以获得斐波那契数列每项的值,每调用一次返回一个值,函数可根据需要重复使用
 1 // 斐波那契数列.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
 2 #include <iostream>
 3 using namespace std;
 4 int fib()
 5 {
 6     static int a0 = 0;
 7     static int a1 = 1;
 8     int ret = a1;
 9     a1 = a0 + a1;
10     a0 = ret;
11     return ret;
12 }
13 int main()
14 {
15     for (int i = 0;i<10;i++)
16     {
17         cout << fib() << endl;
18     }
19     cout << endl;
20     for (int i = 0; i < 5; i++)
21     {
22         cout << fib() << endl;
23     }
24     return 0;
25 }
2.上面程序存在的问题:
  1. 函数一旦开始调用就无法重来
  2. 静态局部变量处于函数内部,外界无法改变
  3. 函数为全局函数,是唯一的,无法多次独立使用
  4. 无法指定某个具体的数列项作为初始值
3.函数对象
  • 使用具体的类对象取代函数
  • 该类的对象具备函数调用的行为
  • 构造函数指定具体数列项的起始位置
  • 多个对象相互独立的求解数列项
4.函数调用操作符( ()  )
  • 只能通过类的成员函数重载
  • 可以定义不同参数的多个重载函数
 1 // 斐波那契数列.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
 2 #include <iostream>
 3 using namespace std;
 4 class Fib
 5 {
 6     int a0;
 7     int a1;
 8 public:
 9     Fib()
10     {
11         a0 = 0;
12         a1 = 1;
13     }
14     //从第n项的值开始计算
15     Fib(int n)
16     {
17         a0 = 0;
18         a1 = 1;
19         for (int i = 2;i<=n;i++)
20         {
21             int t = a1;
22             a1 = a0 + a1;
23             a0 = t;
24         }
25     }
26     // () 操作符重载
27     int operator () ()
28     {
29         int ret = a1;
30         a1 = a0 + a1;
31         a0 = ret;
32         return ret;
33     }
34 };
35 int main()
36 {
37     Fib fib;
38     for (int i = 0;i<10;i++)
39     {
40         //把类的对象当函数来用
41         cout << fib() << endl;
42     }
43     Fib fib2(10);
44     for (int i = 0; i < 10; i++)
45     {
46         //把类的对象当函数来用
47         cout << fib2() << endl;
48     }
49     return 0;
50 }
运行:

pi@raspberrypi:~ $ g++ main.cpp
pi@raspberrypi:~ $ ./a.out
1
1
2
3
5
8
13
21
34
55
55
89
144
233
377
610
987
1597
2584
4181

5.小结:
  1. 函数调用操作符(())是可重载的
  2. 函数调用操作符只能通过类的成员函数重载
  3. 函数调用操作符可以定义不同参数的多个重载函数
  4. 函数对象用于在工程中取代函数指针
 
 
 
 
 
posted @ 2020-01-10 18:18  认真做个普通人  阅读(173)  评论(0编辑  收藏  举报