兰州移动官网网站建设,商城网站建设计划书,优秀网页设计排版,广东和深圳的关系今天来学习函数对象。什么是函数对象呢#xff1f;下面我们以一个例子来引出函数对象的概念。
假设我们需要编写一个函数#xff0c;实现下面这些功能#xff1a; -函数可以获得斐波那契数列每一项的值 -每调用一次返回一个值 -函数可根据需要重复用使用 实现上面的几个…今天来学习函数对象。什么是函数对象呢下面我们以一个例子来引出函数对象的概念。
假设我们需要编写一个函数实现下面这些功能 -函数可以获得斐波那契数列每一项的值 -每调用一次返回一个值 -函数可根据需要重复用使用 实现上面的几个功能我们一开始的逻辑或许是这样的
#include iostream
#include stringusing 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 i0; i10; i){cout fib() endl;}cout endl;for(int i0; i5; i){cout fib() endl;}return 0;
}这个函数的打印结果为 由打印结果看我们貌似实现了斐波那契数列的值 的输出。但是这个函数是存在问题的 *函数一旦调用就无法重来 *静态函数变量处于函数内部外部无法改变 *函数为全局函数是唯一的无法多次独立使用。 *无法指定某个初始的数列项作为初始值打印输出
针对以上问题我们引出函数对象的感念
函数对象 -使用具体的类对象取代函数 -该类对象具有函数调用的行为 -构造函数指定具体数列项的起始位置 -多个对象相互独立的求解数列项。
如何让类对象具有函数调用的行为 *重载函数调用操作符 -只能通过类的成员函数进行重载 -可以定义不同参数的多个重载函数
下面还是直接给出代码分析吧看代码永远比看文字生动形象
#include iostream
#include stringusing namespace std;class Fib
{int a0;int a1;
public:Fib(){a0 0;a1 1;}Fib(int n){a0 0;a1 1;for(int i2; in; 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 i0; i10; i){cout fib() endl;}cout endl;for(int i0; i5; i){cout fib() endl;}cout endl;Fib fib2(10);for(int i0; i5; i){cout fib2() endl;}return 0;
}运行结果为 从这里可以看出我们已经实现了第一个程序所没有解决的问题程序可以重复使用“对象函数”可以从数列的某一个值作为初始值。
总结 1.函数调用操作符是可重载的 2.函数调用操作符只能通过类的成员函数重载 3.函数调用操作符可以定义不同参数的多个重载函数 4.函数对象用于在工程中取代指针。
想一起探讨以及获得各种学习资源加我有我博客中写的代码的原稿 qq1126137994 微信liu1126137994 可以共同交流关于嵌入式操作系统C语言C语言数据结构等技术问题。