C++学习笔记--函数对象

来源:互联网 发布:数据交换共享 编辑:程序博客网 时间:2024/06/15 01:59

什么叫做函数对象?干嘛用?函数对象就是通过对象来实现函数调用的功能,既然说到对象那么自然就想起了类,对的,函数对象就是在一个类里面实现函数调用操作符“()”的重载,那么它有什么用处,回忆一下函数有些什么特性,函数一旦调用就无法重来,局部静态变量处于函数内部,外部无法做出修改,使用全局变量虽然可以在函数更改,但是这又影响了使用,在不同条件下使用就得更改不同的初始状态,还是比较麻烦的,函数是全局的,是唯一的,只能实现同一类型功能。在对函数调用操作符进行重载后就能避免静态变量和全局变量的使用。只需通过对象就能实现重来或者从不同状态开始运行,相对较为安全。

函数调用操作符只能通过类成员函数重载,可以定义成不同参数列表的多个重载函数。通过使用对象取代函数,它具备函数调用的能力,通过构造函数指定状态,多个对象之间互不干扰。在C++行业中默认尽量不明面上使用指针操作,函数对象在工程中可以取代函数指针。

理论只有这么点,拿个实例练练手。

实现一个斐波那契数列,必须实现类对象进行函数调用,同一个对象能够接着前一次数列输出,新对象必须从第一个开始,能实现任意起始位置。

class Fib{    int a0;    int a1;public:    Fib()    {        a0 = 0;        a1 = 1;    }    Fib(int n)    {        a0 = 0;        a1 = 1;        for(int i = 2; i <= n; i++)        {            int ret = a1;            a1 = a0 + a1;            a0 = ret;        }    }    int operator () ()    {        int ret = a1;        a1 = a0 + a1;        a0 = ret;        return ret;    }};int main(){    Fib fib1;    for(int i = 0; i < 5; i++)    {        cout << fib1() << endl;    }    cout << endl;    for(int i = 0; i < 5; i++)    {        cout << fib1() << endl;    }    cout << endl;    Fib fib2;    for(int i = 0; i < 5; i++)    {        cout << fib2() << endl;    }    cout << endl;    Fib fib3(10);    for(int i = 0; i < 5; i++)    {        cout << fib3() << endl;    }    return 0;}
程序看起来篇幅很长,关键之处只在类的定义里,定义了两个构造函数,一个默认从第一个开始,另一个可以知道从任意初始状态开始构造数列。最后一个成员函数是函数调用操作符的重载。由于只要类对象没有被销毁那么这个对象里的所有状态就不会消失,所以能够接着前一次继续构造数列,从程序中可以看出每个新对象默认是从第一个数开始创建数列,同时也可以指明从具体哪一个数开始构造。