zoukankan      html  css  js  c++  java
  • 函数对象分析

    函数对象分析
    1.客户需求
    编写一个函数,函数可以获得斐波那契数列每项的值,每调用一次返回一个值,函数可根据需要重复使用
     1 // 斐波那契数列.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
     2 #include <iostream>
     3 using namespace std;
     4 int fib()
     5 {
     6     static int a0 = 0;
     7     static int a1 = 1;
     8     int ret = a1;
     9     a1 = a0 + a1;
    10     a0 = ret;
    11     return ret;
    12 }
    13 int main()
    14 {
    15     for (int i = 0;i<10;i++)
    16     {
    17         cout << fib() << endl;
    18     }
    19     cout << endl;
    20     for (int i = 0; i < 5; i++)
    21     {
    22         cout << fib() << endl;
    23     }
    24     return 0;
    25 }
    2.上面程序存在的问题:
    1. 函数一旦开始调用就无法重来
    2. 静态局部变量处于函数内部,外界无法改变
    3. 函数为全局函数,是唯一的,无法多次独立使用
    4. 无法指定某个具体的数列项作为初始值
    3.函数对象
    • 使用具体的类对象取代函数
    • 该类的对象具备函数调用的行为
    • 构造函数指定具体数列项的起始位置
    • 多个对象相互独立的求解数列项
    4.函数调用操作符( ()  )
    • 只能通过类的成员函数重载
    • 可以定义不同参数的多个重载函数
     1 // 斐波那契数列.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
     2 #include <iostream>
     3 using namespace std;
     4 class Fib
     5 {
     6     int a0;
     7     int a1;
     8 public:
     9     Fib()
    10     {
    11         a0 = 0;
    12         a1 = 1;
    13     }
    14     //从第n项的值开始计算
    15     Fib(int n)
    16     {
    17         a0 = 0;
    18         a1 = 1;
    19         for (int i = 2;i<=n;i++)
    20         {
    21             int t = a1;
    22             a1 = a0 + a1;
    23             a0 = t;
    24         }
    25     }
    26     // () 操作符重载
    27     int operator () ()
    28     {
    29         int ret = a1;
    30         a1 = a0 + a1;
    31         a0 = ret;
    32         return ret;
    33     }
    34 };
    35 int main()
    36 {
    37     Fib fib;
    38     for (int i = 0;i<10;i++)
    39     {
    40         //把类的对象当函数来用
    41         cout << fib() << endl;
    42     }
    43     Fib fib2(10);
    44     for (int i = 0; i < 10; i++)
    45     {
    46         //把类的对象当函数来用
    47         cout << fib2() << endl;
    48     }
    49     return 0;
    50 }
    运行:

    pi@raspberrypi:~ $ g++ main.cpp
    pi@raspberrypi:~ $ ./a.out
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    55
    89
    144
    233
    377
    610
    987
    1597
    2584
    4181

    5.小结:
    1. 函数调用操作符(())是可重载的
    2. 函数调用操作符只能通过类的成员函数重载
    3. 函数调用操作符可以定义不同参数的多个重载函数
    4. 函数对象用于在工程中取代函数指针
     
     
     
     
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    WCF 4.0中的动态发现服务WSDiscovery
    Windows Server 2008 R2 Server Core
    Open Source Web Design
    Windows Identity Foundation(WIF)正式发布
    是开始学习IronPython 的时候了
    IronPython 承载和消费WCF服务
    微博客程序 Yonkly
    如何启用匿名访问SQL Server Reporting Service 2008
    ASP.NET MVC 2 RC 发布
    SharePoint 2010 VHD下载
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12177563.html
Copyright © 2011-2022 走看看