C++中除了可以对运算、数组操作符进行重载外,同时也能对函数符号“()”进重载,这个就是函数对象,重载“()”后,类对象就能像使用函数的格式一样使用, 定义一个对象className obj; 以函数的方式使用对象obj(),下边我们就来重载“()”操作符,实现斐波那契数列,并且能从任意一个位置开始计算
#include <iostream>
#include <string>
using namespace std;
class Fib
{
private:
int a0;
int a1;
public:
Fib()
{
a0 = 0;
a1 = 1;
}
Fib(int n) //可设置斐波那契数列的起始项
{
a0 = 0;
a1 = 1;
for (int k=2; k<=n; k++)
{
int tmp = a1;
a1 = a0 + a1;
a0 = tmp;
}
}
int operator () () //重载()操作符, 返回的是斐波那契数列的值
{
int ret = a1;
a1 = a0 + a1;
a0 = ret;
return ret;
}
};
int main()
{
Fib fib; //定义一个对象
for (int i=0; i<10; i++)
{
cout << fib() << " "; // 这里可以直接如调用函数一样使用对象
}
cout << endl;
Fib fib2(5); //定义另一个对象,并且从第5位开始计算斐波那契数列
for (int i=0; i<5; i++)
{
cout << fib2() << " ";
}
cout << endl;
system("pause");
}
编译输出:
从输出结果看,是我们要的效果,有两点比较好:一是没有使用全局变量。二是可以随意从新开始,并且能指定从第几个开始。
总结:
-C++中函数操作符“()”是可以重载的
-函数调用操作符只能通过类的成员函数重载
-函数调用操作符可以定义不同参数的多个重载函数
-函数对象用于在工程中取代函数指针