重载函数调用操作符的类,其对象常称为函数对象。函数对象使用重载的()时,行为类似函数调用,也叫做仿函数。本质:
特点:函数对象(仿函数)是一个类,不是一个函数。
函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。
class MyAdd{public:int operator()(int v1, int v2){return v1 + v2;}};// 1、函数调用在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。void test01(){MyAdd myAdd;cout << myAdd(10, 11) << endl;}
函数对象超出普通函数的概念,函数对象可以有自己的函数状态。
// 2、函数对象超出普通函数的概念,函数对象可以有自己的状态。class MyPrint{public:// 构造函数:MyPrint(){this->count = 0;}void operator()(string str){// dosomething.cout << str << endl;this->count++;cout << "这个函数被调用了:" << this->count << "次!" << endl;}private:int count; // 把字段放在public访问调用也可以。};void test02(){MyPrint myPrint;myPrint("hello World");myPrint("hello World");myPrint("hello World");}
hello World这个函数被调用了:1次!hello World这个函数被调用了:2次!hello World这个函数被调用了:3次!
函数对象可以作为参数传递。
void doPrint(MyPrint& mp, string str){mp(str);}void test03(){MyPrint myPrint;doPrint(myPrint, "函数对象作为参数被传入函数中了。");}