• 25 函数对象分析


    1 需求

    • 编写一个函数

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

    2 解决方案

    • 第一个解决方案

      • Demo

        #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;
        }
        
      • 编译运行

        1
        1
        2
        3
        5
        8
        13
        21
        34
        55
        
        89
        144
        233
        377
        610
        
    • 存在的问题

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

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

    3 函数对象

    • 函数调用操作符(()

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

    • 最终的解决方案

      • Demo

        #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;
            
            //指定从第10项开始
            Fib fib2(10);
            
            for(int i = 0; i < 5; i++)
            {
                cout << fib2() << endl;
            }
            
            return 0;
        }
        
      • 编译运行

        1
        1
        2
        3
        5
        8
        13
        21
        34
        55
        
        89
        144
        233
        377
        610
        
        55
        89
        144
        233
        377
        
  • 相关阅读:
    018_STM32程序移植之_串口接收中文
    003_软件安装之_Visual Studio 2012
    001_C#我的第一个串口上位机软件
    017_STM32程序移植之_AS608指纹模块
    016_STM32程序移植之_舵机
    015_STM32程序移植之_NRF24L01模块
    014_STM32程序移植之_L298N电机驱动模块
    002_89C52_Proteus_DAC0832_输出50HZ,正弦波,三角波,矩形波,锯齿波
    001_89C52之_Proteus_ADC0809采集电压
    001_电子工程师招聘笔试题及详细解析
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13903856.html
Copyright © 2020-2023  润新知