C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符
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 重载运算和类型转换)函数调用运算符相关推荐
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)重载运算概述
1. 定义 重载运算是具有特殊名字的函数,它们的名字由关键字operator和其后要定义的运算符号组成. 2. 运算符表 2.1 可重载运算符 运算符类型 运算符种类 双目算术运算符 + (加),-( ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)可调用对象与function
1. 5种形式 可调用对象有5种形式,类型各不同: 形式 解释 函数 返回值类型和实参类型 函数指针 返回值类型和实参类型 lambda表达式 类类型 bind创建的对象 todo 重载了函数调用运算 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象
1. 定义 lambda是函数对象:编写一个lambda后,编译器会将该表达式转换成一个未命名类的未命名对象,类中含有一个重载的函数调用运算符. eg. stable_sort(words.begin ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)递增和递减运算符
并不要求递增和递减运算符一定是类的成员函数,但是因为这个运算符改变的正好是所操作的对象的状态,所以建议将它们设为成员函数. 为了和内置版本保持一致,前置运算符应该返回递增或递减后对象的引用. 为了和内 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数匹配与重载运算符
如果一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题. 如果a是一种类型,表达式 a sym b 可能是: //不能通过调用形式来区分当前 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换
1. 在两种情况下会产生二义性转换歧义: 1.1 A类定义了一个接受B类对象的转换构造函数,同时B类定义了一个转换目标是A类的类型转换运算符. struct B; struct A {A() = de ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符
成员运算符分为两种: 解引用运算符* 箭头运算符-> 设计准则 箭头运算符必须是类的成员. 解引用运算符通常也是类的成员,尽管并非必须如此. 重载的箭头运算符必须返回类的指针或者自定义了箭头运算 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符
运算符 双目算术运算符 + (加),-(减),*(乘),/(除),% (取模) 关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),> ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换
1. 定义 类型转换运算符:(既然一个类类型可以由实参类型对象隐式转换而来,那么)一个类类型的值也可以转换成其它类型 形式 : operator type() const type 表示某种类型,类型 ...
最新文章
- indexedDB数据库的使用
- python-random种子
- WCF编程系列(五)元数据
- python读取matlab矩阵_matlab、python中矩阵的互相导入导出方式
- juniper srx电话单通
- JavaScript中的数组 1
- cocos2dx中的动作
- Docker日志自动化: ElasticSearch、Logstash、Kibana以及Logspout
- meta分析一般步骤
- php xss漏洞扫描工具,XSS漏洞扫描器工具:XSpear
- k8s拉取镜像规则_【大强哥-k8s从入门到放弃13】Service详解
- 计算机毕业设计之java+ssm基于web的医院门诊互联电子病历管理信息系统
- 181124 逆向-2018“柏鹭杯”厦大邀请赛初赛(Re1、2)
- Oracle官方JDBC jar包下载
- 创建属于自己的全景图简明教程——ptgui+720
- 动态规划----最长公共子序列问题
- 学Python该看什么书?所有方向的精华好书推荐,18年老程序员倾囊相授!
- 手把手教你pfx证书转pem
- 嘿嘿,插播消息,最新一期的流言终结者
- Golang可变长数组
热门文章
- C语言 计算2-4+6-8+.....+98-100的结果
- getCurrentSession()与openSession()的区别?
- 计算机网络技术及应用 课程 英语,计算机网络应用—现代英语课堂中的第三种语言...
- 沈阳大学计算机系教师,张春芳(信息工程学院)老师 - 沈阳大学 - 院校大全
- ppp lcp协商报文有哪些_PPP协议
- 在线机房改造类项目建设难点的研究
- Python之sklearn:GridSearchCV()和fit()函数的简介、具体案例、使用方法之详细攻略
- ML之LoR:利用信用卡数据集(欠采样{Nearmiss/Kmeans/TomekLinks/ENN}、过采样{SMOTE/ADASYN})同时采用LoR算法(PR和ROC评估)进行是否欺诈二分类
- DL之ShuffleNet:ShuffleNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- 成功解决WARNING:tensorflow:Variable += will be deprecated. Use variable.assign_add if you want assignmen