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

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

函数调用操作符只能通过类成员函数重载,可以定义成不同参数列表的多个重载函数。通过使用对象取代函数,它具备函数调用的能力,通过构造函数指定状态,多个对象之间互不干扰。在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;
}
程序看起来篇幅很长,关键之处只在类的定义里,定义了两个构造函数,一个默认从第一个开始,另一个可以知道从任意初始状态开始构造数列。最后一个成员函数是函数调用操作符的重载。由于只要类对象没有被销毁那么这个对象里的所有状态就不会消失,所以能够接着前一次继续构造数列,从程序中可以看出每个新对象默认是从第一个数开始创建数列,同时也可以指明从具体哪一个数开始构造。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值