函数对象详细说明

版权声明:请注明转发出处 https://blog.csdn.net/mafucun1988/article/details/89597346

1. 函数对象定义
如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。

2. 函数对象的好处

  (1)函数对象有自己的状态,即它可以携带自己的成员函数,而且这个函数对象在多次调用的过程中它的那些状态是共享的,而函数则不能做到这点(除非定义函数内部的静态变量或者全局变量)。

  (2)函数对象有自己的类型,而普通函数则没有。在使用STL的容器时可以将函数对象的类型传递给容器作为参数来实例化相应的模板,从而来定制自己的算法,如排序算法。
3. 具体应用

  • 无参数
//无参数
void print(){
	cout << "hello world" << endl;
}

class myprint{
public:
	void operator()(){
		cout << "hello world" << endl;
	}
};
///////////////////////////应用
print();
myprint myp;
myp();
  • 有参数
void print02(int index){
	cout << "hello world :" << index  << endl;
}

class myprint02{
public:
	void operator()(int index){
		cout << "hello world :" << index << endl;
	}
};
///////////////////////////应用
print02(10);
myprint02 myp02;
myp02(10);
  • 带有自己的成员变量
//函数对象超出了普通函数的概念,可以保存函数调用状态
//统计函数调用次数?
int g_count = 0;
void print03(){
	g_count++;
}

struct myprint03{
	myprint03() :count(0){}
	void operator()(){
		count++;
	}
	int count;
};
///////////////应用
print03();
print03();

cout << g_count << endl;

myprint03 myp03;
myp03();
myp03();
myp03();

cout << myp03.count << endl;
  • 函数对象做参数 做返回值
//函数对象做参数 做返回值
class myprint04{
public:
	myprint04() :count(0){}
	void operator()(int v){
		count++;
		cout << v << " ";
	}
	int count;
};
//////////////////////应用
vector<int> v;
for (int i = 0; i < 10;i++){
    v.push_back(i);
}

myprint04 myp04;
myprint04 myp05 = for_each(v.begin(), v.end(), myp04); //函数对象做参数
cout << "count:" << myp04.count << endl; cout << endl;
cout << "count:" << myp05.count << endl; cout << endl;

猜你喜欢

转载自blog.csdn.net/mafucun1988/article/details/89597346