函数对象分析

首先我们看我们接到的一个用户需求:

编写一个函数:

  -函数可以获得斐波那契数列每项的值

  -没调用一次返回一个值。

  -函数可以重复使用根据需要。

1 for(int i = 0; i<10; i++)
2 {
3     cout <<fib() << endl;
4 }

比如斐波那契函数,第一二次调用返回1 三次调用返回2,四次返回3。。

 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 int fib()
 7 {
 8     static int a0 = 0;
 9     static int a1 = 1;
10
11     int ret = a1;
12
13     a1 = a0 + a1;
14     a0 = ret;
15
16     return ret;
17 }
18
19
20 int main()
21 {
22     for(int i=0; i<10; i++)
23     {
24         cout << fib() << endl;
25     }
26
27     cout << endl;
28
29     for(int i=0; i<5; i++)
30     {
31         cout << fib() << endl;
32     }
33
34     return 0;
35 }

这段代码我们发现初步满足需要,但客户说我们的不满足需求;

他说:我们这段代码一旦开始就无法重来了。那如果我们定义一个全局变量来redefine可以吗?理论上可以,但客户说的是一个函数,这就不满足客户的需要了,头疼,我怎么做呢?

解决方案:

  -使用具体的类对象取代函数;

  -该类的对象具备函数调用的行为;

  -构造函数指定具体的数列项的起始地址;

  -多个对象相互独立的求解数列项。

函数对象:

-函数调用操作符()

  -只能通过类的成员函数重载

  -可以定义不同参数的多个重载函数。

最终解决方案.cpp:

 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 class Fib
 7 {
 8     int a0;
 9     int a1;
10 public:
11     Fib()
12     {
13         a0 = 0;
14         a1 = 1;
15     }
16
17     Fib(int n)
18     {
19         a0 = 0;
20         a1 = 1;
21
22         for(int i=2; i<=n; i++)
23         {
24             int t = a1;
25
26             a1 = a0 + a1;
27             a0 = t;
28         }
29     }
30
31     int operator () ()
32     {
33         int ret = a1;
34
35         a1 = a0 + a1;
36         a0 = ret;
37
38         return ret;
39     }
40 };
41
42 int main()
43 {
44     Fib fib;
45
46     for(int i=0; i<10; i++)
47     {
48         cout << fib() << endl;
49     }
50
51     cout << endl;
52
53     for(int i=0; i<5; i++)
54     {
55         cout << fib() << endl;
56     }
57
58     cout << endl;
59
60     Fib fib2(10);
61
62     for(int i=0; i<5; i++)
63     {
64         cout << fib2() << endl;
65     }
66
67     return 0;
68 }

小结:

  -函数调用操作符(())是可重载的

  -函数调用操作符只能通过类的成员函数重载

  -函数调用操作符可以定义不同参数的多个重载函数

  -函数对象用于在工程中取代函数指针。

原文地址:https://www.cnblogs.com/lemaden/p/10121688.html

时间: 2024-08-30 15:57:03

函数对象分析的相关文章

函数对象分析(二十九)

通过前面对 C++ 的学习,客户又有一个新的需求摆在我们的面前了.编写一个函数:函数可以获得斐波拉契数列每项的值:没调用一次便返回一个值:函数可根据需要重复使用. 我们之前在 C 语言中也讲过斐波拉契数列,相信这个很好实现了.那么我们就编写的程序如下 #include <iostream> using namespace std; int fib() {     static int a0 = 0;     static int a1 = 1;          int ret = a1;  

C++ 数组操作符重载、函数对象分析、赋值操作符

string类型访问单个字符 #include <iostream> #include <string> #include <sstream> using namespace std; //访问 string单个字符 int main() { string s = "1a2b3a4c"; int n = 0; for(int i=0 ; i< s.length() ; i++) { if(isdigit(s[i]))//isdigit 判断字符

C++--函数对象的分析 经典问题

一.函数对象的分析 Q:客户的需求1.函数可以获得斐波那契数列每项的值2.每调用一次返回一个值3.函数可根据需求重复使用 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;

函数对象+嵌套

#-*-coding:utf-8 -*-'''函数对象:函数是第一类对象,即函数可以当做数据传递 1.可以被引用 2.可以当做参数来传递 3.返回值可以是函数 4.可以当做容器类型的元素'''#1.可以被引用# def foo():# print('from foo')# func=foo# print(foo)# print(func)# func()#2.可以被当做参数传递# def foo():# print('from foo')# def bar(func):# print(func)

8、泛型程序设计与c++标准模板库5.函数对象

1.函数对象 函数对象是STL提供的第四类主要组件,它使得STL的应用更加灵活方便,从而增强了算法的通用性.大多数STL算法可以用一个函数对象作为参数.所谓"函数对象"其实就是一个行为类似函数的对象,它可以不需要参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态. 在c++程序设计中,任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征,因此都可以作为函数对象传递给算法作为参数使用. 以数值算法accumulate()为例子,介绍函数对象

C++ 函数对象

1.考虑下面的需求,从集合中找到一个与当前Student相等的学生,如下:int main(int argc, char* argv[]){ Student s1(20,"Andy"); Student s2(23,"Bill"); Student s3(28,"Caroline"); Student s4(27,"David"); Student s5(21,"Eric"); vector<Stud

C++11系列之——临时对象分析

/*C++中返回一个对象时的实现及传说中的右值——临时对象*/ 如下代码: 1 /**********************************************/ 2 class CStudent; 3 CStudent GetStudent() 4 { 5 CStudent loc_stu; 6 return loc_stu; 7 } 8 9 int main() 10 { 11 CStudent stu = GetStudent(); 12 } 13 /************

C++ 理解函数对象与lambda表达式

参考<21天学通C++>第21与第22章节,对函数对象进行介绍,同时通过lambda表达式这一匿名函数对象的简洁方式加深对函数对象的理解.本篇博文的主要内容是: (1) 函数对象的概念: (2) 将函数对象用作谓词: (3) 如何使用函数对象实现一元.二元谓词: (4) 如何编写lambda表达式: (5) 如何将lambda表达式用作谓词: (6) 如何编写可存储和可操作状态的lambda表达式. 一. 函数对象 1. 函数对象的概念和种类 函数对象是C++实体,从概念上讲,函数对象是用作函

十、闭包函数、函数对象、装饰器

函数对象: 函数是第一类对象 第一类对象: 指可以在执行期创造并作为参数传递给其他函数或存入一个变量的实体 第一类对象所特有的特性为: 可以当容器被存入变量或其他结构 可以被作为参数传递给其他函数 可以被作为函数的返回值 可以在执行期创造,而无需完全在设计期全部写出 即使没有被系结至某一名称,也可以存在 函数.类.模块等所有对象都是第一类的 闭包函数: 函数内定义的函数为内部函数 内部函数包含对外部作用域而非全局作用域的引用 定义闭包函数的基本形式: def 外部函数名(): 内部函数需要的变量