• 第35课 函数对象分析


    客户需求
    编写一个函数
    -函数可以获得斐波那契数列每项的值
    -每调用一次返回一个值
    -函数可根据需要重复使用
    for(int i=0; i<10; i++)
    {
      cout << fib() << endl;
    }

    #include <iostream>
    #include <string>
    
    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>
    #include <string>
    
    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;
        }
        
        cout << 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;
    }

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

  • 相关阅读:
    scrapy-redis使用以及剖析
    完全理解 Python 迭代对象、迭代器、生成器
    Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
    HTTP状态码
    Py西游攻关之RabbitMQ、Memcache、Redis
    Django contenttypes 应用
    cookie和session 以及Django中应用
    RESTful规范
    rest_framework框架的认识
    vue 总结
  • 原文地址:https://www.cnblogs.com/-glb/p/11924701.html
Copyright © 2020-2023  润新知