C++:函数指针进阶(四):函数对象operator()
C++中的 operator() 有两大主要作用:
1:Overloading --------重载() 操作符
2: Casting------实现对象类型转化
1:Overloading重载() 操作符
函数对象(仿函数):定义了调用操作符() 的类对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般。因此取名叫函数对象,它是一个类,不是一个函数。
class A {
public :
mutable int var; // 定义可变成员变量
int operator() (int val) {
return val >0 ? val : -val
}
}
上面的操作符 operator() 表示的意思就是: 类A 中定义了操作符() ,A对象调用语句在形式上跟以下函数的调用完全一样:
int i = -1 ;
A func;
std::cout << func(i);
那么,operator()函数对象 操作符与普通函数相比,有哪些有点了
- 函数对象比函数更加灵活;
- 函数对象可以有自己的状态,我们可以在类中定义状态变量,这样一个函数对象在多次的调用中可以共享这个状态;但是普通函数就没有这种优势,除非它使用全局变量来保存这个状态。
- 函数对象有自己特有的类型,我们可以传递相应的类型作为参数来实例化相应的模板,比如说带参数的函数形参。而普通函数就无类型可言,这种特性对于使用C++标准库来说是至关重要的,这样我们在使用STL中的函数时,可以传递相应的类型作为参数来实例化相应的模板,从而实现我们自己定义的规则和定制自己的算法。
2:使用函数对象的经典例子
打印小于5的数值。
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;class print {
public:print(int j) : m_j(j){// 声明静态变量 count_num来统计进入函数的次数static int count_num = 0;cout << "进入构造函数次数:" << count_num++ << endl;}
public:void operator()(int i){if (i < m_j) {cout << i << endl;}}public:int m_j;
};int main(int argv, char* argc[])
{vector<int> it = { 1,2,3,4, 6, 7, 8 };for_each(it.begin(), it.end(), print(5));return 0;
}// 打印结果
进入构造函数次数:0
1
2
3
4
仿函数配合 STL进行使用,用于方便模板类和模板函数,还是上面的例子,但是现在不确定 vector存储的类型,也不确定所输出的条件。
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;/**类模板作用:建立一个通用类,类中的成员数据类型可以不具体指定,用一个虚拟的类型来代表。语法:template<typename T>解释:template ------声明创建模板typename ------ 表明后面的符号是一种数据类型,并且可以用class 替代T ------通用的数据类型,名称开业替换,通常为大写字母
*/
template<typename T>
class print {
public:print(T j) : m_j(j){// 声明静态变量 count_num来统计进入函数的次数static int count_num = 0;cout << "进入构造函数次数:" << count_num++ << endl;}
public:// 输出比 i 小的值void operator()(int i){if (i < m_j) {cout << i << endl;}}// 打印字符串长度大小小于i 的值void operator()(string i) {if (i.size()<m_j){cout << i << endl;}}public:T m_j;
};int main(int argv, char* argc[])
{vector<int> it = { 1,2,3,4, 6, 7, 8 };// 我们在初始化一个对象,需要显示的指定模板参数列表类型。for_each(it.begin(), it.end(), print<int>(5));vector<string> it2 = { "123", "12345", "123436", "1343253245" };for_each(it2.begin(), it2.end(), print<int>(5));return 0;
}// 打印输出进入构造函数次数:0
1
2
3
4
进入构造函数次数:1
123
3: 隐式类型转换
C++:函数指针进阶(四):函数对象operator()相关推荐
- C++:函数指针进阶(三):Lambda函数详解
1:Lambda函数语法 C++ 语法的基本格式为: [capture](parameters) -> return_type { /* ... */ } (1) [capture] :[]内为 ...
- 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数
回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...
- 函数指针与回调函数、句柄
函数指针 定义: 函数指针是指向函数的指针变量. 因而"函数指针"本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量.字符型.数组一样,这里是指向函数. ...
- 函数指针实现回调函数
首先说明是函数指针,函数指针,就是一个函数,将其函数名指针化,通过传入指针调用不同的函数 手撸代码一次 #include<stdio.h> void max(int a,int b) { ...
- c语言函数指针封装函数,C语言之函数指针、回调函数的使用
一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...
- C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数
C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...
- Linux C 函数指针应用---回调函数
(这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知) 我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表 ...
- Linux C 函数指针应用---回调函数
(这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知) 我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表 ...
- C++ 函数指针 类成员函数指针
一.函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址. 1.函数 ...
- 类的成员函数指针和静态成员函数指针 调用成员函数***
C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...
最新文章
- 把iPhone充电口改成Type-C,卖了56万!
- 【计算机网络】计算机网络 标准化及组织 ( 标准化工作 | 标准化工作流程 | 标准化工作组织 )
- SpringBoot | 第十五章:基于Postman的RESTful接口测试
- vmware安装linux不能和主机互通,Ubuntu18.04系统主机与虚拟机互通问题的解决方法...
- FCN 学习: Semantic Segmentation
- SpringMVC之组合注解@GetMapping
- 读《系统虚拟化-原理与实现》-第一章
- 对Python列表进行封装和二次开发实现自定义栈结构
- primefaces教程_Primefaces BlockUI组件示例教程
- Android 数字格式化
- 【细胞分割】基于matlab GUI阙值+边缘+形态学+种子点图像分割【含Matlab源码 615期】
- 加密狗破解原理和破解方法介绍
- 麟龙指标通达信指标公式源码_通达信麟龙指标套三主图+副图指标 贴图
- 图像处理——Haar特征
- ATAPI(磁盘端口驱动)级文件保护简单实现
- phpword 模板替换文字和图片
- SMTP邮箱服务器发送邮件
- 2022-2028年中国农作物行业投资战略分析及发展前景研究报告
- 【AE-MG动画全套学习教程】After Effects CC MG动画高效学习视频全套
- 【BZOJ-28921171】强袭作战大sz的游戏 权值线段树+单调队列+标记永久化+DP...
热门文章
- 算法之排序算法(冒泡法和选择法)
- 机器学习 —— 支持向量机
- WIN10系统下ODBC的配置
- 如何保证同事的代码不会腐烂?一文带你了解 Alibaba COLA 架构
- 413 request entity too large php,413 Request Entity Too Large
- CocoaPods出现The dependency `` is not used in any concret错误的解决方法
- Python Curses
- b460m迫击炮黑苹果_现阶段最便宜的完美黑苹果配置
- 学渣!面对疾风吧!哈撒给
- 深度学习英文缩写_机器学习、深度学习……人工智能那些名词你知道几个?