1:Overloading --------重载() 操作符
2: Casting------实现对象类型转化
函数对象(仿函数):定义了调用操作符() 的类对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般。因此取名叫函数对象,它是一个类,不是一个函数。
class A {
public :
mutable int var; // 定义可变成员变量
int operator() (int val) {
return val >0 ? val : -val
}
}
上面的操作符 operator() 表示的意思就是: 类A 中定义了操作符() ,A对象调用语句在形式上跟以下函数的调用完全一样:
int i = -1 ;
A func;
std::cout << func(i);
那么,operator()函数对象 操作符与普通函数相比,有哪些有点了
打印小于5的数值。
#include
#include
#include
using namespace std;
class print {
public:
print(int j) : m_j(j)
{
// 声明静态变量 count_num来统计进入函数的次数
static int count_num = 0;
cout << "进入构造函数次数:" << count_num++ << endl;
}
public:
void operator()(int i)
{
if (i < m_j) {
cout << i << endl;
}
}
public:
int m_j;
};
int main(int argv, char* argc[])
{
vector it = { 1,2,3,4, 6, 7, 8 };
for_each(it.begin(), it.end(), print(5));
return 0;
}
// 打印结果
进入构造函数次数:0
1
2
3
4
仿函数配合 STL进行使用,用于方便模板类和模板函数,还是上面的例子,但是现在不确定 vector存储的类型,也不确定所输出的条件。
#include
#include
#include
using namespace std;
/**
类模板
作用:建立一个通用类,类中的成员数据类型可以不具体指定,用一个虚拟的类型来代表。
语法:template
解释:template ------声明创建模板
typename ------ 表明后面的符号是一种数据类型,并且可以用class 替代
T ------通用的数据类型,名称开业替换,通常为大写字母
*/
template
class print {
public:
print(T j) : m_j(j)
{
// 声明静态变量 count_num来统计进入函数的次数
static int count_num = 0;
cout << "进入构造函数次数:" << count_num++ << endl;
}
public:
// 输出比 i 小的值
void operator()(int i)
{
if (i < m_j) {
cout << i << endl;
}
}
// 打印字符串长度大小小于i 的值
void operator()(string i) {
if (i.size() it = { 1,2,3,4, 6, 7, 8 };
// 我们在初始化一个对象,需要显示的指定模板参数列表类型。
for_each(it.begin(), it.end(), print(5));
vector it2 = { "123", "12345", "123436", "1343253245" };
for_each(it2.begin(), it2.end(), print(5));
return 0;
}
// 打印输出
进入构造函数次数:0
1
2
3
4
进入构造函数次数:1
123