函数对象分析
首先我们看我们接到的一个用户需求:
编写一个函数:
-函数可以获得斐波那契数列每项的值
-没调用一次返回一个值。
-函数可以重复使用根据需要。
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 }
小结:
-函数调用操作符(())是可重载的
-函数调用操作符只能通过类的成员函数重载
-函数调用操作符可以定义不同参数的多个重载函数
-函数对象用于在工程中取代函数指针。