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).函数也是一个对象 ...
随机推荐
- 349B - Color the Fence
Color the Fence Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Su ...
- 用大白话扯扯那"神奇"的面向对象编程思维(一)
前言: 每当提到面向对象的时候,初学者肯定都是一脸懵逼的状态,到底什么是面向对象?会用面向对象后有什么牛逼之处吗?不会用是不是就会死掉?答案肯定不会死掉,我们可以来简单的举一 个栗子 1.当你想到熊猫 ...
- [Bayesian] “我是bayesian我怕谁”系列 - Gaussian Process
科班出身,贝叶斯护体,正本清源,故拿”九阳神功“自比,而非邪气十足的”九阴真经“: 现在看来,此前的八层功力都为这第九层作基础: 本系列第九篇,助/祝你早日hold住神功第九重,加入血统纯正的人工智能 ...
- 一:配置使用阿里云Maven库
鉴于国内的网络环境,从默认 Maven 库下载 jar 包是非常的痛苦. 速度慢就不说了,还经常是下不下来,然后一运行就是各种 ClassNotFoundException,然后你得找到残留文件删掉重 ...
- 使用dynamic特性处理XML文档
处理XML文档是我们经常需要进行的一项工作,尤其是在进行网络服务相关编程时,比如更新RSS等.在.NET 3.5中引入了Linq To XML,使得XML文档的读写已经大大简化,而.NET 4.0中最 ...
- 【python】python中 简单的 glob模块
glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用windows下的文件搜索差不多.查找文件只用到三个匹配符:"*", "?&quo ...
- Winform界面中实现菜单列表的动态个性化配置管理
在我们一般的应用系统里面,由于系统是面向不同类型的用户,我们所看到的菜单会越来越多,多一点的甚至上百个,但是我们实际工作接触的菜单可能就是那么几个,那么对于这种庞大的菜单体系,寻找起来非常不便.因此对 ...
- [Python]循环嵌套nested loop-练习题
[python的for循环嵌套打印如下图形] 图形一: ******* ******* ******* ******* 图形二: * *** ***** ******* 图形三: * *** **** ...
- PyCharm教程
1.PyCharm3.0默认快捷键 2.PyCharm默认模板设置 3.字体设置 1.PyCharm3.0默认快捷键(翻译的)PyCharm Default Keymap 1.编辑(Editing) ...
- setTimeout和setInterval的使用
引自(http://www.cnblogs.com/qiantuwuliang/archive/2009/06/20/1507304.html) 这两个方法都可以用来实现在一个固定时间段之后去执行Ja ...