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).函数也是一个对象 ...
随机推荐
- Leetcode题解(十五)
42.Trapping Rain Water 题目 这道题目参考http://www.cnblogs.com/felixfang/p/3713197.html 观察下就可以发现被水填满后的形状是先升后 ...
- (2017浙江省赛E)Seven Segment Display
Seven Segment Display Time Limit: 2 Seconds Memory Limit: 65536 KB A seven segment display, or ...
- Codeforces Round #386 (Div. 2) C. Tram
C. Tram time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Thinkphp5 常量设置问题
楼主是之前使用了thinkphp3.2快两年了,很早就听说过thinkphp的版本已经到达5了. 不过鉴于早期的版本尚未完善,并没有立即开始学习.最近做一个项目,尝试一下新的知识. 但是在使用的时候, ...
- 基于JQuery EasyUI的WebMVC控件封装(含源码)
JQuery EasyUI类库,大家不会陌生,出来已经有很多年了.个人感觉还是很好用的,作者更新频率也很快,bug也及时修复. 最近在整理以前的代码,找到了这个组件,它是将EasyUI组件封装成MVC ...
- Android 开发笔记___实战项目:购物车
购物车的应用很广泛,电商app基本上都有它的身影.由于它用到了多种存储方式,通过项目对数据的存储有更高层次的了解. 1.设计思路 首先看看购物车的外观.第一次进入时里面是空的,去购物页面加入购物车以后 ...
- 远程连接SQL Server 2014遇到的问题和解决
在本机可以通过IP地址的数据库引擎登录数据库,可用同网段的其它电脑远程登录一直不成功.查看网上资料,认为是主机防火墙的问题. 在微软网站上查找相关的文档找到了答案.http://msdn.micros ...
- HBase流量限制和表负载均衡剖析
1.概述 在HBase-1.1.0之前,HBase集群中资源都是全量的.用户.表这些都是没有限制的,看似完美实则隐患较大.今天,笔者就给大家剖析一下HBase的流量限制和表的负载均衡. 2.内容 也许 ...
- 有关数据传输GET和POST的方法的区别
有关前后端数据交互,主要是通过走http协议通过post或get的方法,拿angularJS来说:通过JS来发送http请求调用相关接口: $scope.apostDate=function(){ $ ...
- c#把汉字转化成全拼音函数(全拼)
/// <summary> /// 把汉字转换成拼音(全拼) /// </summary> /// <param name=&q ...