函数对象分析
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.上面程序存在的问题:
-
函数一旦开始调用就无法重来
-
静态局部变量处于函数内部,外界无法改变
-
函数为全局函数,是唯一的,无法多次独立使用
-
无法指定某个具体的数列项作为初始值
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.小结:
-
函数调用操作符(())是可重载的
-
函数调用操作符只能通过类的成员函数重载
-
函数调用操作符可以定义不同参数的多个重载函数
-
函数对象用于在工程中取代函数指针