C++中函数调用操作符的重载
1,本博文讲述函数对象问题;
2,客户需求:
1,编写一个函数:
1,函数可以获得斐波那契数列每项的值;
2,每调用一次返回一个值;
3,函数可根据需要重复使用;
4,代码示例:
for(int i=; i<; i++)
{
cout << fib() << endl;
}
3,第一个解决方案编程实验:
1,main.cpp 文件:
#include <iostream>
#include <string> using namespace std; int fib()
{
static int a0 = ; // 记录函数状态;
static int a1 = ; int ret = a1; a1 = a0 + a1; // 更新 a1 的值;
a0 = ret; // a0 更新; return ret;
} int main()
{
for(int i=; i<; i++)
{
cout << fib() << endl; //fib() 是带状态的函数,因为每次调用的结果是不同的,当输入的参数是一样的,返回结果必然是一样的函数叫做无状态函数;
} cout << endl; for(int i=; i<; i++)
{
cout << fib() << endl;
} return ;
}
2,输出结果:
3,带状态函数:每次调用的返回结果不同的函数,即相同的输入参数,不同的返回结果;
4,两种方法实现带状态函数:
1,是将函数内部要使用的变量用全局变量来代替,可以记录上一次函数调用的状态,但是代码中建议不要使用全局变量;
2,是将函数内部要使用的变量用静态局部变量来代替;
4,存在的问题:
1,函数一旦开始调用就无法重来:
1,静态局部变量处于函数内部,外界无法改变;
2,函数为全局函数,是唯一的,无法多次独立使用;
3,无法指定某个具体的数列项作为初始值;
2,当用全局变量来使用时,可以达到目的,但是要在调用函数之前设置全局变量初始值,这样和用户的要求不符合;
5,解决方案:
1,函数对象:
1,使用具体的类对象取代函数;
2,该类的对象具备函数调用的行为;
1,很了不起的行为;
3,构造函数指定具体数列项的起始位置;
4,多个对象相互独立的求解数据项;
6,函数对象:
1,函数调用操作符(()):
1,只能通过类的成员函数重载;
2,可以定义不同参数的多个重载函数;
(3),C 和 C++ 中,函数调用操作符 “()” 其实是编译器内置的操作符,它的地位同 “[]” 一致,可以被重载,重载后一个类的对象可以当做 函数来使用;
7,最终解决方案编程实验:
1,main.cpp 文件:
#include <iostream>
#include <string> using namespace std; class Fib
{
int a0;
int a1;
public:
Fib()
{
a0 = ;
a1 = ;
} /* 这个函数实现的非常经典 */
Fib(int n)
{
a0 = ;
a1 = ; for(int i=; i<=n; i++)
{
int t = a1; a1 = a0 + a1;
a0 = t;
}
} int operator () () // 重载函数调用操作符 (),这样类的对象就可以当做函数来调用;
{
int ret = a1; a1 = a0 + a1;
a0 = ret; return ret;
}
}; int main()
{
Fib fib; for(int i=; i<; i++)
{
cout << fib() << endl; // fib 不是函数名,而是对象名,这里将对象当做函数调用;
} cout << endl; for(int i=; i<; i++)
{
cout << fib() << endl;
} cout << endl; Fib fib2(); // 第二个对象和第一个独立,也就可以从头开始了; for(int i=; i<; i++)
{
cout << fib2() << endl;
} return ;
}
2,输出结果:
3,提供函数对象,通过私有成员变量来记录函数调用状态,意味着绕开了局部 变量和全局变量这样的限制;
4,带状态函数实现方法:
1,用全局变量实现函数内部的使用变量;
2,静态局部变量;
3,函数对象中的成员变量;
8,小结:
1,函数调用操作符(())是可重载的;
2,函数调用操作符只能通过类的成员函数重载;
1,和 “=” 相同;
3,函数调用操作符可以定义不同参数的多个重载函数;
4,函数对象用于在工程中取代函数指针;
1,实际的 C++ 工程项目中,我们要尽量少的使用原生的指针;
2,字符串可以使用字符串类而不用字符数组,数组可以使用数组对象,函数指针可以用函数对象,这些对象都是用于在工程中取代指针;
C++中函数调用操作符的重载的更多相关文章
- C++中 关于操作符的重载
C++实现了类的定义,也可以对类之间的操作符进行定义,又叫重载. 例如同类之间的 加.减法,赋值等等操作. 具体看http://blog.csdn.net/zhy_cheng/article/deta ...
- 5.7 C++函数调用操作符重载
参考:http://www.weixueyuan.net/view/6385.html 总结: 需要以类成员函数的形式对函数调用操作符“()”进行重载. 只有常成员函数才能处理常对象,故我们依然在类中 ...
- 【C++】C++中的操作符重载
C++中的操作符重载使得对于类对象的操作更加方便和直观,但是对于各种操作符重载的规则以及语法形式,一直以来都是用到哪一个上stackoverflow上查找,在查找了四五次之后,觉得每次麻烦小总结一下. ...
- C++中逗号操作符重载的分析
1,关注逗号操作符重载后带来的变化: 2,逗号操作符: 1,逗号操作符(,)可以构成都好表达式:exp1, exp2, exp3, ..., expN 1,逗号表达式用于将多个表达式连接为一个表达式: ...
- C++中复制构造函数与重载赋值操作符总结
前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符 ...
- C++中的操作符重载
一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...
- C++中前置操作符和后置操作符的重载
1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++ // i 的值作为返回值,i 自增 1: ...
- C++中逻辑操作符的重载分析
1,逻辑运算符的原生语义: 1,操作数只有两种值(true 和 false): 1,C 语言中只有非 0 和 0: 2,逻辑表达式不用完全计算就能确定最终值: 1,短路规则: 3,最终结果只能是 tr ...
- 【转】c++ new操作符的重载
基本概念: 1. 操作符重载:C++支持对某个操作符赋予不同的语义 2. new操作符:申请内存,调用构造函数 关于c++ new操作符的重载 你知道c++ 的new 操作符和operator new ...
随机推荐
- JVM(15)之 类加载器
开发十年,就只剩下这套架构体系了! >>> 今天我们将类加载机制5个阶段中的第一个阶段,加载,又叫做装载.为了便于阅读,以下都叫做装载. 装载的第一步就是要获得二进制的字节 ...
- k3 cloud中库存转移处理
有个苗木基地的苗木要转移到另一个,是做那个单据 解决办法:两个基地是同一组织 做直接调拨单就行了 ,不同组织做调拨申请单,然后做 分布式调出 分布式调入
- elasticsearch 基础 —— 请求体查询
请求体查询 简易 查询 -query-string search- 对于用命令行进行即席查询(ad-hoc)是非常有用的. 然而,为了充分利用查询的强大功能,你应该使用 请求体 search API, ...
- Git --06 Git-gui安装
目录 1.Git-gui安装 1.Git-gui安装
- Sass函数:列表函数nth
语法: nth($list,$n) nth() 函数用来指定列表中某个位置的值.不过在 Sass 中,nth() 函数和其他语言不同,1 是指列表中的第一个标签值,2 是指列给中的第二个标签值,依此类 ...
- 如何触发react input change事件
页面用react来进行开发的,想触发react组件里面input的change事件,用Jquery的trigger来触发没有效果,必须使用原生的事件来进行触发. var event = new Eve ...
- js中给数组添加元素的方法有哪些
unshift:将参数添加到原数组开头,并返回数组的长度 pop:删除原数组最后一项,并返回删除元素的值:如果数组为空则返回undefined push:将参数添加到原数组末尾,并返回数组的长度 co ...
- Redis缓存在django中的配置
django settings中的配置 # 缓存 CACHES = { "default": { "BACKEND": "django_redis. ...
- 存储系统设计——NVMe SSD性能影响因素一探究竟
目录1 存储介质的变革 2 NVME SSD成为主流 2.1 NAND FLASH介质发展 2.2 软件层面看SSD——多队列技术 2.3 深入理解SSD硬件 3 影响NVME SSD的性能因素 3. ...
- Mac 上使用svn 记录
.启动svn服务器 svnadmin create /Users/liuwei/Desktop/svn/UI 如果本地有 UI这个目录了就不用再运行 使用这句就可以了 svnserve -d -r / ...