1. 定义

如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象,

eg.

struct absInt{int operator()(int val) const{return val < 0 ? -val : val;}
};int i = -42;
absInt absObj;
int ui = absObj(i);    //i被传递给absObj.operator()

2. 特性

  • 函数调用运算符必须定义为成员函数。
  • . 一个类可以定义多个不同版本的调用运算符,相互之间必须在参数数量或类型上有所区别。
  • . 具备函数调用运算符的类同时也能存储状态,所以与普通函数相比它们更加灵活。
  • . 函数对象常常作为泛型算法的实参。
class PrintString
{public:PrintString(ostream &o = cout, char c = ' '):os(o), sep(c) { }void operator()(const string &s) const{os << s << sep;}private:ostream &os;   // stream on which to writechar sep;      // character to print after each output
};string strText = "test";PrintString printer;  // uses the defaults; prints to coutprinter(strText);     // prints s followed by a space on coutPrintString printer2(cerr, '_');printer2(strText);        //cerr中打印s,后面跟一个换行符//函数对象常常作为泛型算法的实参std::vector<string> vecStr = {"a1", "b1"};for_each(vecStr.begin(), vecStr.end(), PrintString(cerr, '-'));

输出结果:

test test_a1-b1-

【引用】

[1] 代码functionObject.h

C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符相关推荐

  1. C++ Primer 5th笔记(chap 14 重载运算和类型转换)重载运算概述

    1. 定义 重载运算是具有特殊名字的函数,它们的名字由关键字operator和其后要定义的运算符号组成. 2. 运算符表 2.1 可重载运算符 运算符类型 运算符种类 双目算术运算符 + (加),-( ...

  2. C++ Primer 5th笔记(chap 14 重载运算和类型转换)可调用对象与function

    1. 5种形式 可调用对象有5种形式,类型各不同: 形式 解释 函数 返回值类型和实参类型 函数指针 返回值类型和实参类型 lambda表达式 类类型 bind创建的对象 todo 重载了函数调用运算 ...

  3. C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象

    1. 定义 lambda是函数对象:编写一个lambda后,编译器会将该表达式转换成一个未命名类的未命名对象,类中含有一个重载的函数调用运算符. eg. stable_sort(words.begin ...

  4. C++ Primer 5th笔记(chap 14 重载运算和类型转换)递增和递减运算符

    并不要求递增和递减运算符一定是类的成员函数,但是因为这个运算符改变的正好是所操作的对象的状态,所以建议将它们设为成员函数. 为了和内置版本保持一致,前置运算符应该返回递增或递减后对象的引用. 为了和内 ...

  5. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数匹配与重载运算符

    如果一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题. 如果a是一种类型,表达式 a sym b 可能是: //不能通过调用形式来区分当前 ...

  6. C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换

    1. 在两种情况下会产生二义性转换歧义: 1.1 A类定义了一个接受B类对象的转换构造函数,同时B类定义了一个转换目标是A类的类型转换运算符. struct B; struct A {A() = de ...

  7. C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符

    成员运算符分为两种: 解引用运算符* 箭头运算符-> 设计准则 箭头运算符必须是类的成员. 解引用运算符通常也是类的成员,尽管并非必须如此. 重载的箭头运算符必须返回类的指针或者自定义了箭头运算 ...

  8. C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符

    运算符 双目算术运算符 + (加),-(减),*(乘),/(除),% (取模) 关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),> ...

  9. C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换

    1. 定义 类型转换运算符:(既然一个类类型可以由实参类型对象隐式转换而来,那么)一个类类型的值也可以转换成其它类型 形式 : operator type() const type 表示某种类型,类型 ...

最新文章

  1. indexedDB数据库的使用
  2. python-random种子
  3. WCF编程系列(五)元数据
  4. python读取matlab矩阵_matlab、python中矩阵的互相导入导出方式
  5. juniper srx电话单通
  6. JavaScript中的数组 1
  7. cocos2dx中的动作
  8. Docker日志自动化: ElasticSearch、Logstash、Kibana以及Logspout
  9. meta分析一般步骤
  10. php xss漏洞扫描工具,XSS漏洞扫描器工具:XSpear
  11. k8s拉取镜像规则_【大强哥-k8s从入门到放弃13】Service详解
  12. 计算机毕业设计之java+ssm基于web的医院门诊互联电子病历管理信息系统
  13. 181124 逆向-2018“柏鹭杯”厦大邀请赛初赛(Re1、2)
  14. Oracle官方JDBC jar包下载
  15. 创建属于自己的全景图简明教程——ptgui+720
  16. 动态规划----最长公共子序列问题
  17. 学Python该看什么书?所有方向的精华好书推荐,18年老程序员倾囊相授!
  18. 手把手教你pfx证书转pem
  19. 嘿嘿,插播消息,最新一期的流言终结者
  20. Golang可变长数组

热门文章

  1. C语言 计算2-4+6-8+.....+98-100的结果
  2. getCurrentSession()与openSession()的区别?
  3. 计算机网络技术及应用 课程 英语,计算机网络应用—现代英语课堂中的第三种语言...
  4. 沈阳大学计算机系教师,张春芳(信息工程学院)老师 - 沈阳大学 - 院校大全
  5. ppp lcp协商报文有哪些_PPP协议
  6. 在线机房改造类项目建设难点的研究
  7. Python之sklearn:GridSearchCV()和fit()函数的简介、具体案例、使用方法之详细攻略
  8. ML之LoR:利用信用卡数据集(欠采样{Nearmiss/Kmeans/TomekLinks/ENN}、过采样{SMOTE/ADASYN})同时采用LoR算法(PR和ROC评估)进行是否欺诈二分类
  9. DL之ShuffleNet:ShuffleNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  10. 成功解决WARNING:tensorflow:Variable += will be deprecated. Use variable.assign_add if you want assignmen