1. 为什么需要函数对象

(1)案例

  ①编写一个函数,使函数可以获得斐波那契数列每项的值

  ②每调用一次返回一个值

  ③函数可根据需要重复使用

【编程实验】第一个解决方案

#include <iostream>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++){//注意每次调用fib(),形式完全相同,但函数返回的结果不同!//这叫有状态函数,因为函数内部会通过static变量//记录上次的状态
cout << fib() << endl; //1,1,2,3,5,8,13,21,34,55
}cout << endl;//函数不能回到初始状态,会从新的状态开始,继续计算。for(int i = 0; i < 5; i++){cout << fib() << endl; //89,144,233,377,610,从上次结果开始
}   return 0;}

(2)存在的问题

  ①函数一旦开始调用无法重来(因为这种函数是有状态的函数

  ②静态局部变量处理函数内部外界无法改变

  ③函数为全局函数,是唯一的,无法多次独立使用

  ④无法指定某个具体的数列项作为初始值

(3)解决方案:函数对象

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

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

  ③构造函数指定具体的数列项的起始位置

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

2. 函数对象

(1)函数调用操作符()

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

  ②可以定义不同参数多个重载函数

【编程实验】最终解决方案

#include <iostream>using namespace std;class Fib{private:int a0;int a1;public:    Fib():a0(0),a1(1){}int operator()() //operator()为函数名,后面的()为参数列表,这里为空
{int ret = a1;a1 = a0 + a1;a0 = ret;return ret;}   Fib(int n)//设置初始化
{a0 = 0;//先将初始化a0,a1
a1 = 1;for(int i = 2; i<=n;i++){int t = a1;a1 = a0 + a1;a0 = t;}}   };int main(){Fib fib;for(int i = 0; i < 10; i++){//fib是个对象,但因重载操作符(),可以用这个对象名调用函数(重载操作符//本质上是个函数),这种方式就像函数名调用函数一样直观!
cout << fib() << endl; //1,1,2,3,5,8,13,21,34,55
}cout << endl;for(int i = 0; i < 5; i++){cout << fib() << endl; //89,144,233,377,610,从上次结果开始
}   Fib fib2(10);//从第10个元素开始输出for(int i=0; i<5;i++){cout << fib2() <<endl; //55,89,144,233,377
}return 0;}

3. 小结

(1)函数调用操作符()是可以重载

(2)函数调用操作符()只能通过成员函数重载

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

(4)函数对象用于在工程中取代函数指针

转载于:https://www.cnblogs.com/hoiday/p/10166377.html

第35课 函数对象分析(函数操作符()重载)相关推荐

  1. 【C++】什么是函数对象和函数对象的用处

    目录 什么是函数对象 函数对象的用处 什么是函数对象 class myprint {public:void operator()(int num){cout << "num &q ...

  2. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  3. python 3.28 第三章 函数嵌套/名称空间//内置名称空间/全局名称空间/局部名称空间/作用域/函数对象/闭包函数。...

    1 函数嵌套: 函数内可以调用了其他的函数. # def max2(x,y):# if x > y:# return x# else:# return y## def max3(x,y,z):# ...

  4. 二叉树(类模板、函数模板、函数对象、函数指针)

    这个二叉树的代码只是简单的实现了一些功能,比如插入和遍历.关键是用到了函数指针和函数对象,还有shared_ptr. 其中shared_ptr一定定义在节点中,因为new出来的空间时节点,释放的时候是 ...

  5. C++:函数对象(函数符)

    C++:函数对象(函数符) 1.什么是函数对象 2.重载了()运算符的类对象 1.什么是函数对象 函数对象也叫函数符,函数符是可以以函数方式与()结合使用的任意对象.这包括函数名.指向函数的指针和重载 ...

  6. 函数对象、 函数对象与容器、函数对象与算法

    一.函数对象 1.函数对象(function object)也称为仿函数(functor) 2.一个行为类似函数的对象,它可以没有参数,也可以带有若干参数. 3.任何重载了调用运算符operator( ...

  7. 从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法

    http://blog.csdn.net/jnu_simba/article/details/9500219 一.函数对象 1.函数对象(function object)也称为仿函数(functor) ...

  8. find(),find_if(),以及巧妙的函数对象,函数适配器

    在学习到<Essential C++>3.6节时自己按照自己的想法来实现书上提到的思路.代码虽然简单,不过自己却发现有很多其他地方不熟悉,比如函数指针的用法,仿函数和函数适配器的使用.捣鼓 ...

  9. python 返回函数对象_Python—函数对象与闭包

    一 函数对象 函数对象指的是函数可以被当做"数据"来处理,具体可以分为四个方面的使用. 1.1 函数可以被引用 def index(): print('from index') a ...

  10. 函数对象 java_函数对象

    函数对象 * 一种将函数作为参数传递的独创方法 是注意到 在我们想传递的参数 即包含数据 也保包含方法,于是我们可以定义一个 * 不包含数据 只 包含方法的类,并传递该类的一个实例,事实上,一个函数通 ...

最新文章

  1. 转 前端工程师凭什么这么值钱?
  2. 2020腾讯广告算法大赛十强名单出炉!
  3. LeetCode每日一题:回文链表(No.234)
  4. POWERSHELL基于ConvertTo-Htm指定单元格效果css风格html报表
  5. 絮语----工作四年的碎碎念
  6. mt6765和骁龙665哪个好_小米11正式发布,首发骁龙888+白送快充头,售价3999起
  7. ios 数组中的字典排序_利用数组和字典,实现按指定规则的排序
  8. Jmeter接口测试实战分享,你一定要知道的问题总结!
  9. Spark 概念学习系列之从spark架构中透视job(十六)
  10. 3dsmax如何批量导入obj格式文件
  11. comsol3.5 软件下载
  12. MacBookpro连不上WiFi,网络增加新的位置解决
  13. 泛在操作系统实践案例
  14. 确认OHS版本的方法
  15. 单总线CPU微程序控制器设计
  16. 字体图标svg改变颜色
  17. 自动驾驶仿真软件列表
  18. 闲人闲谈PS之一项目库存跨公司业务STO解决方案--SAP闲人的开篇
  19. SD卡 TF卡 , micro-SD卡信号接口引脚定义
  20. RK3399教程:android hal 加载wifi

热门文章

  1. Android 滑动冲突问题的简单解决思路
  2. activity+window+view简单说明
  3. python写透视挂_python – OpenCV透视变换给出了意想不到的结果
  4. 打造一流云计算机房,【迈向“双一流”】为科研插上云计算的“翅膀”
  5. Linux状态监控在root下可用,监控linux状态
  6. python css selector_使用python处理selenium中的css_selector定位元素的模糊匹配问题
  7. java comparable与_Java中Comparable和Comparator区别
  8. html如何连接外部网页,怎么链接一个外部的css文件?
  9. 前牙正常覆盖是多少_深覆合千万不要矫正?用图示告诉你深覆合深覆盖的区别是什么,有什么危害...
  10. java json jquery_JQuery提交JSON string数据