文章目录

  • 一、代码举例
  • 二、重载operator()作用
  • 三、优势
  • 四、使用举例
    • 1)当callback函数使用,用以通用操作
    • 2)谓词函数
  • 五、注意事项

一、代码举例

class ClassAction
{public:void operator()(){......}
private:int dataValue;
}

二、重载operator()作用

c++类可以重载()【即小括号符】,来实现仿函数,或者叫函数对象。那么这个类可以行使函数的功能,用以优雅的实现一些功能

  • 实例举例代码
class FuncClass
{
public:void operator()(const string& str) const{std::cout << str << std::endl;}
};
int main()
{ FuncClass myFuncClass; myFuncClass("hello world");
}

三、优势

与普通函数相比,函数对象(仿函数)比普通函数更加灵活,函数对象的优势:
1)函数对象可以有自己的状态。我们可以在类中定义状态变量,这样一个函数对象在多次的调用中可以共享这个状态;
2)函数对象有自己特有的类型。我们可以传递相应的类型作为参数来实例化相应的模板,比如说带参数的函数形参。

四、使用举例

1)当callback函数使用,用以通用操作

class ShorterThan
{
public: explicit ShorterThan(int maxLength):length(maxLength) {} bool operator() (const string& str) const { return str.length() < length; }
private: const int length;
};
int main()
{ vector<string> myVec; myVec.push_back("Jack"); myVec.push_back("Llihass"); myVec.push_back("tTT"); int result = count_if(myVec.begin(), myVec.end(), ShorterThan(4)); cout << "count: " << result << endl;
}

2)谓词函数

谓词函数通常用来对传进来的参数进行判断,并返回布尔值。但是一般的函数形式固化,比如字符串长度比较只能判断是否大于一个确定的长度值。函数对象可以作为谓词函数,并可以在类初始化时传递参数,如字符串长度参考值,因此函数对象比普通函数更加灵活。

class Upper
{
public: Upper(int min = 0):m_min(min){} bool operator() (int value) const { return value >= m_min; }
private: int m_min;
};
int main()
{vector<int> intVec;intVec.push_back(10);intVec.push_back(6);intVec.push_back(12);vector<int>::iterator targetIterator = find_if(intVec.begin(), intVec.end(), Upper(10));if (targetIterator != intVec.end()){cout << "value: " << *targetIterator << endl;}
}
  • 调用流程
    首先生成类 Upper 的对象,并用 10 初始化,调用find_if 时将用该函数对象进行判断。

五、注意事项

在调用用到函数对象的标准库算法时,除非显式地指定模板类型为传引用,否则默认情况下函数对象是按值传递的!

C++类重载 operator()相关推荐

  1. 通过从全局和类内部重载operator new /delete来获取内存管理权

    目录 1.通过重载获得内存管理权 2.容器的内存管理 3.重载new.array new.replacement new,接管内存控制权 1.重载全局::operator new / ::operat ...

  2. C++——运算符重载operator

    C++--运算符重载operator C++ prime plus第11章,运算符重载是C++的一种多态.运算符重载格式如下: operator运算符(argument-list) 1.做普通函数重载 ...

  3. 【C++】运算符重载 Operator Overload

    运算符重载 Operator Overload 可以为运算符增加一些新的功能 class Point { private:int m_x;int m_y; public:Point(int x, in ...

  4. 实验7.1 对Point类重载“++”(自增)、“–”(自减)运算符

    题目 定义Point类,有坐标_x,_y两个成员变量:对Point类重载"++"(自增)."–"(自减)运算符,实现对坐标值的改变. C++代码如下: #inc ...

  5. 【转】C++中如何区分构造函数与重载operator()得到的仿函数?

    转自:C++中如何区分构造函数与重载operator()得到的仿函数?求大神!_360问答 此外,你觉得仿函数(functor)是否能完全取代function呢? 以下是个人使用C++仿函数,func ...

  6. 类的operator new与operator delete的重载

    为什么有必要写自己的operator new和operator delete? 答案通常是:为了效率. 缺省版本的operator new是一种通用型的内存分配器,它必须可以分配任意大小的内存块.同样 ...

  7. C++ Time类重载运算符

    题目描述 设计一个时间类Time,要求: 1.包含时(hour),分(minute),秒(second)私有数据成员: 2.包含构造函数,重载关于一时间加上另一时间的加法运算符"+" ...

  8. [YTU]_2440( C++习题 复数类--重载运算符+,-,*,/)

    题目描述 定义一个复数类Complex,重载运算符"+","-","*","/",使之能用于复数的加.减.乘.除.运算符 ...

  9. [YTU]_2443 ( C++习题 复数类--重载运算符3+)

    题目描述 请编写程序,处理一个复数与一个double数相加的运算,结果存放在一个double型的变量d1中,输出d1的值,再以复数形式输出此值.定义Complex(复数)类,在成员函数中包含重载类型转 ...

最新文章

  1. 使用python的while语句,编写简单门票与年龄计算器
  2. python做小程序-抖音最火的整蛊表白小程序如何做出来的?教你用python做出
  3. 【云计算】云计算从业者导学
  4. integer对应java类型_Java中的Integer和int等包装类和基本数据类型简单比较
  5. 登录代码,程序不是作文
  6. Spring简化Java开发_第1章—Spring之旅—简化Spring的java开发
  7. 学计算机应用基础学到了什么,2021年学习计算机应用基础心得体会-得范文网
  8. 前端开发常用网站整理
  9. 窃听信道模型中的保密通信性能研究
  10. 测试高中低音的软件6,分别用什么音乐来测试设备的高中低音。
  11. Go-获取整形切片中的最大值最小值
  12. text生成pdf之ctexwineditmiktexgbk2uni的安装使用方法
  13. 可用于微信公众平台的机器人
  14. 李彦宏:有人弄死其他对手 自己也没好结果
  15. BitComet的简介与下载
  16. ftp下载工具绿色版,ftp下载工具有绿色版的吗?教程详解
  17. DataWhale天池-金融风控贷款违约预测-Task01赛题理解
  18. 《数字语音处理》- 实验4. 基于MATLAB与VQ的特定人孤立词语音识别研究(附代码)
  19. python数据分析——pyecharts柱状图全解(小白必看)
  20. 100 个知名网站源码

热门文章

  1. 4. 非监督学习与强化学习简介
  2. [有奖活动进行中]阿里数据库专家曾文旌为你解决数据库那些事
  3. 使用第三方GitLab进行登录认证
  4. 打一把游戏看一场病:当VR成为“数字新药”
  5. CUMT2020华为杯
  6. CUMT2022算法设计与分析A考试
  7. 微信小程序自定义tabbar底部菜单
  8. 单机java_java实现单机版五子棋小游戏
  9. 扑克王怎样于市场中基于金叉死叉进行趋势跟踪
  10. IN和EXISTS的区别和使用