C++中的函数对象

    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++中函数操作符“()”是可以重载的
    -函数调用操作符只能通过类的成员函数重载
    -函数调用操作符可以定义不同参数的多个重载函数
    -函数对象用于在工程中取代函数指针

猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/81461619