C++ 函数对象
函数对象
c++中函数名后的()称为函数调用运算符。函数调用运算符也可以重载,如果某个类重载了函数调用运算符,则该类的实例就是一个函数对象。函数对象本身并不是很有用,但他们使得算法操作的参数化策略成为可能,使通用性算法变得更加通用(让函数作为参数还可以通过函数指针)
实例
class Add
{
public:
double operator()(double x,double y)
{
return x+y;
}
};
Add plus; //plus就是一个函数对象
cout<<plus(1.2,3.4)<<endl;//通过函数对象调用重载函数
cout<<Add()(1.2,3.4)<<endl; //Add()会创建一个临时对象
学习代码
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
/*
class absInt {
};
*/ //class和struct都是定义类,struct成员默认属性为public
void print(double i)
{
cout << i << " ";
}
void myforeach(vector<double>::iterator & t1, vector<double>::iterator & t2, void(*fun)(double i))//可以通过函数指针将一个函数作为另一个函数的参数
{
while (t1 != t2)
{
fun(*t1);
++t1;
}
}
struct absInt {
//重载操作符()
int operator()(int val)
{
return val < 0 ? -val : val;
}
};
template <typename elementType>
void FuncDisplayElement(const elementType & element)
{
cout << element << " " ;
}
template <typename elementType>
struct DisplayElement {
//存储状态
int m_nCount;
DisplayElement()
{
m_nCount = 0;
}
void operator()(const elementType & element)
{
++m_nCount;
cout << element << " ";
}
};
int main()
{
absInt absObj;//函数对象
int i = -2;
unsigned int ui = absObj(i);//通过函数对象调用函数
cout << ui << endl;
vector<int> a;
for (int i = 0; i < 10; i++)
{
a.push_back(i);
}
DisplayElement<int> mResult;
mResult = for_each(a.begin(), a.end(), mResult);//把函数对象作为参数传递给另一个函数
cout << endl;
cout << "数量" << mResult.m_nCount << endl;
list<char> b;
for (char c = 'a'; c < 'k'; ++c)
{
b.push_back(c);
}
for_each(b.begin(), b.end(), DisplayElement<char>());//DisplayElement<char>()会创建一个临时对象
cout << endl;
vector<double> vec = { 76,92,86,74,95 };
cout << "vec里的类容为:" << endl;
for_each(vec.begin(), vec.end(), print);
cout << "vec里的内容为" << endl;
myforeach(vec.begin(), vec.end(), print);
getchar();
return 0;
}
例子
#include <iostream>
#include <string>
using namespace std;
struct student {
string sno;
student()
{
cout << "调用构造函数son为:" << sno << "#"<<endl;
}
student(string sno)
{
this->sno = sno;
cout << "调用构造函数sno为:" << this->sno << "#" << endl;
}
void operator()(string sno)
{
this->sno = sno;
cout << "调用函数对象sno为:" << this->sno << "#" << endl;
}
};
int main()
{
student s("2014");//输出"调用构造函数sno为:2014#"
student s2; //输出"调用构造函数sno为:#"
s("2014"); //输出"调用函数对象sno为:2014#"
getchar();
return 0;
}
C++ 函数对象的更多相关文章
- 函数对象(仿函数 functor)
简单地说,函数对象就是一个重载了()运算符的类实例,它可以像一个函数一样使用. #include <iostream> using namespace std; class Add { p ...
- javascript 利用匿名函数对象给你异步回调方法传参数
先来创建一个匿名函数对象: /*** * 匿名函数 */ var callChangeBtn=new function(bugBtn){ this.chage=function(json){ bugB ...
- 3.2 STL中的函数对象类模板
*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...
- C++模板中的函数对象
在C++模板类map中一个参数为Compare类型,该类型为一个比较函数,其完整定义如下: template< class Key, class T, class Compare = std:: ...
- C++ Pirmer : 第十四章 : 重载运算符与类型转换之函数调用运算符与标准库的定义的函数对象
函数调用运算符 struct test { int operator()(int val) const { return (i > 0 ? i : -i); } }; 所谓的函数调用就是一个类重 ...
- EffectiveJava——用函数对象表示策略
有些语言支持函数指针.代理.lambda表达式,或者支持类似的机制,允许程序把“调用特殊函数的能力”储存起来并传递这种能力.这种机制通常用于允许函数的调用者通过传入第二个函数,来指定自己的行为.比较器 ...
- python 学习笔记3(循环方式;list初始化;循环对象/生成器/表推导;函数对象;异常处理)
### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 16. 循环方式笔记: 1)range(0, 8, 2) #(上限,下限,步长) 可以实现对元素或者下标的 ...
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
- 认识js函数对象(Function Object)
认识函数对象(Function Object) 可以用function关键字定义一个函数,对于每个函数可以为其指定一个函数名,通过函 数名来进行调用.这些都是代码给用户的印象,而在JavaScript ...
- Python进阶07 函数对象
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象 ...
随机推荐
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest J Cleaner Robot
Cleaner RobotCrawling in process... Crawling failed Time Limit:2000MS Memory Limit:524288KB ...
- Circle
Circle Memory Limit: 32768KB 64bit IO Format: %lld & %llu Status Description Your task is so ...
- 轻松驾驭Tomcat
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...
- localstorage本地定时缓存
在做一个网站时,起初直接就是从服务器获取数据进行交互,没有用一些本地缓存做优化,项目做下来就特别卡,并且对服务器造成了很大的压力,经过请教,查询,找到这样一个定时缓存的例子.html5定时缓存,从数据 ...
- Git问题集锦
1.初始新建git,出现No refs in common and none specified; doing nothing 解决方案:Perhaps you should specify a br ...
- Go环境搭建
Linux系统golang环境搭建 1.下载安装包go1.8.linux-amd64.tar golang安装包下载地址:https://golang.org/dl/ ( 有可能被FQ) 2.解 ...
- OPENCV3——从入门到出门
跑第一个程序的时候经过坑爹的各种设置终于能用了. 如果遇到问题就谷歌或者百度,大牛的博客会给出解决方案的. vs2010+opencv3 目标:把书上的程序挨个敲一遍跑一遍. 现在已经跑了七章了,还有 ...
- MatlabR2015b用了一段时间之后需要重新激活
问题描述:MatlabR2015b安装成功,用了一段时间之后需要重新激活,按照http://www.cr173.com/soft/490645.html教程,无法激活成功,卸载重新安装也不行. 解决方 ...
- 网络分析法(Analytic Network Process,ANP)
什么是网络分析法 网络分析法(ANP)是美国匹兹堡大学的T.L.Saaty教授于1996年提出的一种适应非独立的递阶层次结构的决策方法,它是在层次分析法(Analytic Hierarchy Proc ...
- Unity3D_GUI (1)--按钮控件
这是自己的第一篇记录自己的技术文章,自己还是个菜鸟,有错误之处还望大家能够多多指点. 下面记录的是自己在学GUI.Button的自己认知,这里用的是代码进行控制,当然当你学熟练了就可以直接使用GUI ...