C++学习笔记--函数对象
来源:互联网 发布:数据交换共享 编辑:程序博客网 时间:2024/06/15 01:59
什么叫做函数对象?干嘛用?函数对象就是通过对象来实现函数调用的功能,既然说到对象那么自然就想起了类,对的,函数对象就是在一个类里面实现函数调用操作符“()”的重载,那么它有什么用处,回忆一下函数有些什么特性,函数一旦调用就无法重来,局部静态变量处于函数内部,外部无法做出修改,使用全局变量虽然可以在函数更改,但是这又影响了使用,在不同条件下使用就得更改不同的初始状态,还是比较麻烦的,函数是全局的,是唯一的,只能实现同一类型功能。在对函数调用操作符进行重载后就能避免静态变量和全局变量的使用。只需通过对象就能实现重来或者从不同状态开始运行,相对较为安全。
函数调用操作符只能通过类成员函数重载,可以定义成不同参数列表的多个重载函数。通过使用对象取代函数,它具备函数调用的能力,通过构造函数指定状态,多个对象之间互不干扰。在C++行业中默认尽量不明面上使用指针操作,函数对象在工程中可以取代函数指针。
理论只有这么点,拿个实例练练手。
实现一个斐波那契数列,必须实现类对象进行函数调用,同一个对象能够接着前一次数列输出,新对象必须从第一个开始,能实现任意起始位置。
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++) { int ret = a1; a1 = a0 + a1; a0 = ret; } } int operator () () { int ret = a1; a1 = a0 + a1; a0 = ret; return ret; }};int main(){ Fib fib1; for(int i = 0; i < 5; i++) { cout << fib1() << endl; } cout << endl; for(int i = 0; i < 5; i++) { cout << fib1() << endl; } cout << endl; Fib fib2; for(int i = 0; i < 5; i++) { cout << fib2() << endl; } cout << endl; Fib fib3(10); for(int i = 0; i < 5; i++) { cout << fib3() << endl; } return 0;}程序看起来篇幅很长,关键之处只在类的定义里,定义了两个构造函数,一个默认从第一个开始,另一个可以知道从任意初始状态开始构造数列。最后一个成员函数是函数调用操作符的重载。由于只要类对象没有被销毁那么这个对象里的所有状态就不会消失,所以能够接着前一次继续构造数列,从程序中可以看出每个新对象默认是从第一个数开始创建数列,同时也可以指明从具体哪一个数开始构造。
阅读全文
0 0
- 【C++】学习笔记三十五——函数和string对象
- 【C++】学习笔记三十六——函数和array对象
- C++:函数<学习笔记>
- C++函数对象学习笔记
- C++学习笔记--函数对象
- 【C++】【学习笔记】【014】对象
- C学习笔记之函数
- C/C学习笔记/函数与程序结构
- C++学习笔记(六)函数对象
- STL 学习笔记 之 函数对象
- C++函数返回一个对象学习笔记
- C++学习笔记(六)函数对象
- JavaScript学习笔记(二) 对象与函数
- Javascript学习笔记-2(对象、函数)
- C++ STL 学习笔记 函数对象
- JS学习笔记-函数对象的方法
- Object-c学习笔记十一-----对象初始化
- Objective-C 学习笔记 01 - 对象
- Python机器学习库sklearn KFold交叉验证分组情况样本
- python3和python2的区别
- IP报文分析(IPV4)
- leetcode 315. Count of Smaller Numbers After Self
- mongoDB3.4(一)单个节点centos下 yum安装
- C++学习笔记--函数对象
- 徐登沿的第十四个程序(利用静态变量计算n的阶乘)
- Java线程
- 第十三周【项目2
- 数据库存储过程和函数
- 在 JavaScript 中为什么 typeof null 的结果是 object?为什么呢?
- Nginx安装手册
- java-pdf转word3.0
- 二叉树