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()函数对象 操作符与普通函数相比,有哪些有点了

  1. 函数对象比函数更加灵活;
  2. 函数对象可以有自己的状态,我们可以在类中定义状态变量,这样一个函数对象在多次的调用中可以共享这个状态;但是普通函数就没有这种优势,除非它使用全局变量来保存这个状态。
  3. 函数对象有自己特有的类型,我们可以传递相应的类型作为参数来实例化相应的模板,比如说带参数的函数形参。而普通函数就无类型可言,这种特性对于使用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()相关推荐

  1. C++:函数指针进阶(三):Lambda函数详解

    1:Lambda函数语法 C++ 语法的基本格式为: [capture](parameters) -> return_type { /* ... */ } (1) [capture] :[]内为 ...

  2. 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

    回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...

  3. 函数指针与回调函数、句柄

    函数指针 定义: 函数指针是指向函数的指针变量. 因而"函数指针"本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量.字符型.数组一样,这里是指向函数. ...

  4. 函数指针实现回调函数

    首先说明是函数指针,函数指针,就是一个函数,将其函数名指针化,通过传入指针调用不同的函数 手撸代码一次 #include<stdio.h> void max(int a,int b) { ...

  5. c语言函数指针封装函数,C语言之函数指针、回调函数的使用

    一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...

  6. C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数

    C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...

  7. Linux C 函数指针应用---回调函数

    (这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知) 我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表 ...

  8. Linux C 函数指针应用---回调函数

    (这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知) 我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表 ...

  9. C++ 函数指针 类成员函数指针

    一.函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址. 1.函数 ...

  10. 类的成员函数指针和静态成员函数指针 调用成员函数***

    C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...

最新文章

  1. 把iPhone充电口改成Type-C,卖了56万!
  2. 【计算机网络】计算机网络 标准化及组织 ( 标准化工作 | 标准化工作流程 | 标准化工作组织 )
  3. SpringBoot | 第十五章:基于Postman的RESTful接口测试
  4. vmware安装linux不能和主机互通,Ubuntu18.04系统主机与虚拟机互通问题的解决方法...
  5. FCN 学习: Semantic Segmentation
  6. SpringMVC之组合注解@GetMapping
  7. 读《系统虚拟化-原理与实现》-第一章
  8. 对Python列表进行封装和二次开发实现自定义栈结构
  9. primefaces教程_Primefaces BlockUI组件示例教程
  10. Android 数字格式化
  11. 【细胞分割】基于matlab GUI阙值+边缘+形态学+种子点图像分割【含Matlab源码 615期】
  12. 加密狗破解原理和破解方法介绍
  13. 麟龙指标通达信指标公式源码_通达信麟龙指标套三主图+副图指标 贴图
  14. 图像处理——Haar特征
  15. ATAPI(磁盘端口驱动)级文件保护简单实现
  16. phpword 模板替换文字和图片
  17. SMTP邮箱服务器发送邮件
  18. 2022-2028年中国农作物行业投资战略分析及发展前景研究报告
  19. 【AE-MG动画全套学习教程】After Effects CC MG动画高效学习视频全套
  20. 【BZOJ-28921171】强袭作战大sz的游戏 权值线段树+单调队列+标记永久化+DP...

热门文章

  1. 算法之排序算法(冒泡法和选择法)
  2. 机器学习 —— 支持向量机
  3. WIN10系统下ODBC的配置
  4. 如何保证同事的代码不会腐烂?一文带你了解 Alibaba COLA 架构
  5. 413 request entity too large php,413 Request Entity Too Large
  6. CocoaPods出现The dependency `` is not used in any concret错误的解决方法
  7. Python Curses
  8. b460m迫击炮黑苹果_现阶段最便宜的完美黑苹果配置
  9. 学渣!面对疾风吧!哈撒给
  10. 深度学习英文缩写_机器学习、深度学习……人工智能那些名词你知道几个?