今天来学习函数对象。什么是函数对象呢?下面我们以一个例子来引出函数对象的概念。

假设我们需要编写一个函数,实现下面这些功能:
-函数可以获得斐波那契数列每一项的值
-每调用一次返回一个值
-函数可根据需要重复用使用
实现上面的几个功能,我们一开始的逻辑或许是这样的:

#include <iostream>
#include <string>using namespace std;int fib()
{static int a0 = 0;static int a1 = 1;int ret = a1;  //先将a1保存起来给reta1 = a0 + a1;a0 = ret;      //再将a1的值给a0return ret;    //此时ret为a1,即要输出的每一项
}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++)   //这个循环实现可以让斐波那契数列的初始值从n开始输出打印{int t = a1;a1 = a0 + a1;a0 = t;}}int operator () ()  //函数调用操作符()的重载{int ret = a1;a1 = a0 + a1;a0 = ret;return ret;    //返回a1,就是要打印输出的值}
};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;
}

运行结果为:

从这里可以看出,我们已经实现了第一个程序所没有解决的问题:程序可以重复使用“对象函数”,可以从数列的某一个值作为初始值。

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

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

【C++深度剖析教程13】函数对象的分析相关推荐

  1. 【C++深度剖析教程29】C++对象模型分析下

    加qq1126137994,微信:liu1126137994 一起学习更多技术!!! 今天来继续学习C++对象模型! 在C++编译器内部,类可以理解为结构体 子类是由父类成员叠加子类新成员得到的 下面 ...

  2. 【C++深度剖析教程28】C++对象模型分析

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 今天记录学习的内容是:C++对象模型分析!!! 本质分析: clas ...

  3. 【C++深度剖析教程7】C++之类中的函数重载

    函数重载的回顾(接上一篇文章): 函数重载的本质为相互独立的不同的函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的成员 ...

  4. Python教程:函数对象与函数嵌套

    一:函数对象 精髓:可以把函数当成变量去用 1.可以赋值 # func=内存地址 def func():print('from func')f=func # 函数func赋值给变量f print(f, ...

  5. 【C++深度剖析教程39】实现C++数组类模板

    上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...

  6. 【C++的深度剖析教程21】类型转换函数下

    上一篇文章写了关于普通类型转换为类类型的语法与性质,今天我们来看一下:类类型如何转换为普通类型. 一.类型转换函数: C++类中,可以定义类型转换函数,类型转换函数用于将类对象转换为其他类型. 语法规 ...

  7. 【C++深度剖析教程5】C++中类的静态成员函数

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

  8. 【C++深度剖析教程2】C++经典问题解析之二 this指针与成员函数

    隐藏的this指针,所有对象共享类的成员函数 写一篇博客花费时间虽然长,但是却让你对内容的记忆尤为深刻,尤其是你对它的态度.记录菜鸟的成长日记,也希望同为菜鸟的你们与我一起共同进步!!现在分享的是C+ ...

  9. 【C++深度剖析教程1】C++中的经典问题解析-c++中的对象的构造顺序与析构顺序

    c++中的对象的构造顺序与析构顺序 问题一 当程序中存在多个对象时,如何确定这些对象的析构顺序? 一.单个函数创建时构造函数的调用顺序 1.调用父类的构造过程 2.调用成员变量的构造函数(调用顺序与声 ...

最新文章

  1. 案例分析:机场运作系统
  2. 。net面试题(2)
  3. 西安电子科技大学计算机接口与通用技术答案,西安电子科技大学--西电《计算机接口与通信技术》平时作业...
  4. 包装类java_java中的包装类
  5. 使用SAP CRM中间件XIF(External Interface)一步步创建服务订单
  6. 连接maven_如何在Eclipse中使用Maven工程连接远程的Spark
  7. 几点减几点怎么列算式_[股票一般几点可以买入]股票缩量怎么买 | 爱淘股吧
  8. Permissions for id_rsa are too open
  9. 不用正则表达式,用javascript从零写一个模板引擎(一)
  10. linux进程创建时间,linux进程创建时间计算
  11. 正则表达式的一些符号基础和实例解析
  12. linux下安装nodejs及cnpm
  13. php$_GET的作用,PHP-$_GET和$_POST不起作用
  14. Remove_if 删除vector数据
  15. 制作嵌入式文件系统工具 mkfs.ext2 mkfs.ext3 mkfs.ext4
  16. 《如何让你爱的人爱上你》第一部分:第一印象
  17. NSGA_2 Matlab带约束问题的多目标优化求解方案+惩罚函数
  18. 金丹期前期:1.2、python语言-python的基本元素:变量及命名规则、数据类型及转换、运算符、输入输出
  19. ThreadPoolExecutor(一)——简介
  20. C++右值引用与函数返回值

热门文章

  1. 第十五期:真相了,中台到底“出路”还是“末路”?
  2. html:(24):内联式css和嵌入式css
  3. StatusCodeError: 400 - “{\“code\“:40000,\“error\“:\“错误 Error: 登录用户不是该小程序的开发者
  4. JS实现滚动监听以及滑动到顶部
  5. 避免switch嵌套的一种方法
  6. Hibernate中inverse属性与cascade属性
  7. 阿里云服务器邮件发送
  8. [BZOJ 1452] Count
  9. EF6 如何判断DataContext有修改,以及如何放弃修改
  10. easyui-datebox禁止手动输入