C++超详细讲解函数对象

 更新时间:2022年06月01日 09:04:31   作者:清风自在 流水潺潺  
在c++中,我们把所有能当作函数使用的对象统称为函数对象。它是实现operator()的任何类型,此运算符被称为调用运算符,当调用此操 作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象

一、客户需求

编写一个函数

  1. 函数可以获得斐波那契数列每项的值
  2. 每调用一次返回一个值
  3. 函数可根据需要重复使用

下面来看第一个解决方案:

#include <iostream>
using namespace std;
int fib()
{
    static int a0 = 0;
    static int a1 = 1;
    int ret = a1;
    a1 = a0 + a1;
    a0 = ret;
    return ret;
}
int main()
{
    for (int i = 0; i < 10; i++)
    {
        cout << fib() << endl;
    }
    cout << endl;
    for (int i = 0; i < 5; i++)
    {
        cout << fib() << endl;
    }
    return 0;
}

输出结果如下:

二、存在的问题

函数一旦开始调用就无法重来

  • 静态局部变量处于函数内部,外界无法改变
  • 函数为全局函数,是唯一的,无法多次独立使用
  • 无法指定某个具体的数列项作为初始值

三、解决方案

函数对象

  • 使用具体的类对象取代函数
  • 该类的对象具备函数调用的行为
  • 构造函数指定具体数列项的起始位置
  • 多个对象相互独立的求解数列项

四、函数对象

函数调用操作符(( ))

  • 只能通过类的成员函数重载
  • 可以定义不同参数的多个重载函数

所以最终解决方案如下:

#include <iostream>
using namespace std;
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 t = a1;
            a1 = a0 + a1;
            a0 = t;
        }
    }
    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() << endl;
    }
    for (int i = 0; i < 5; i++)
    {
        cout << fib() <<endl;
    }
    cout << endl;
    Fib fib2(10);
    for (int i = 0; i < 5; i++)
    {
        cout << fib2() << endl;
    }
    return 0;
}

输出结果如下:

五、小结

  • 函数调用操作符(( ))是可重载的
  • 函数调用操作符只能通过类的成员函数重载
  • 函数调用操作符可以定义不同参数的多个重载函数
  • 函数对象用于在工程中取代函数指针

到此这篇关于C++超详细讲解函数对象的文章就介绍到这了,更多相关C++函数对象内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++ 防止头文件重复引入的三种方法

    c++ 防止头文件重复引入的三种方法

    这篇文章主要介绍了c++ 防止头文件重复引入的三种方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-02-02
  • VC通过托盘图标得到该所属进程的实现代码

    VC通过托盘图标得到该所属进程的实现代码

    这篇文章主要介绍了VC通过托盘图标得到该所属进程的实现代码,为了方便大家使用特将多个代码分享给大家,需要的朋友可以参考下
    2021-10-10
  • C++中sprintf使用的方法与printf的区别分析

    C++中sprintf使用的方法与printf的区别分析

    这篇文章主要介绍了C++中sprintf使用的方法与printf的区别,实例分析了sprintf与printf的具体用法及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C语言实现扫雷游戏简易版

    C语言实现扫雷游戏简易版

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏简易版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C语言实现推箱子游戏完整代码

    C语言实现推箱子游戏完整代码

    这篇文章主要为大家详细介绍了C语言实现推箱子游戏完整代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++获取任务栏打开程序窗口示例

    C++获取任务栏打开程序窗口示例

    这篇文章主要介绍了C++获取任务栏打开程序窗口,大家可以参考使用
    2013-11-11
  • MFC创建右键弹出菜单的方法

    MFC创建右键弹出菜单的方法

    这篇文章主要介绍了MFC创建右键弹出菜单的方法,较为详细的分析了创建菜单资源及视类添加WM_RBUTTONDOWN消息的实现方法,是非常实用的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C语言杨氏矩阵查找算法实例讲解

    C语言杨氏矩阵查找算法实例讲解

    杨氏矩阵是一个数字矩阵,矩阵的每一行从左到右一次递增,矩阵从上到下递增,在这样的矩阵中查找一个数字是否存在。时间复杂度小于O(N),有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-09-09
  • C++重载运算符的规则详解

    C++重载运算符的规则详解

    运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数
    2013-10-10
  • c++引用传参和指针传参的区别及说明

    c++引用传参和指针传参的区别及说明

    这篇文章主要介绍了c++引用传参和指针传参的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论