一个函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。举个最简单的例子:
类FuncObjType中重载了“()”操作符,因此对于一个该类的对象FuncObjType val,可以这样调用该操作符:val()。调用结果即输出以上代码中的内容。该调用语句在形式上跟以下函数的调用完全一样:
类FuncObjType中重载了“()”操作符,因此对于一个该类的对象FuncObjType val,可以这样调用该操作符:val()。调用结果即输出以上代码中的内容。该调用语句在形式上跟以下函数的调用完全一样:
既然用函数对象与调用普通函数有相同的效果,为什么还有搞这么麻烦定义一个类来使用函数对象?主要在于函数对象有以下的优势:
1. 函数对象可以有自己的状态。我们可以在类中定义状态变量,这样一个函数对象在多次的调用中可以共享这个状态。但是函数调用没这种优势,除非它使用全局变量来保存状态。呃,面向对象编程。。。全局变量。。。。
2. 函数对象有自己特有的类型,而普通函数无类型可言。这种特性对于使用C++标准库来说是至关重要的。这样我们在使用STL中的函数时,可以传递相应的类型作为参数来实例化相应的模板,从而实现我们自己定义的规则。比如自定义容器的排序规则。
举几个使用函数对象的典型的例子:
第一个即自定义容器set对字符串string的排序规则。首先来定义相应的类并重载 “()” 来规定排序(这里我们按从大到小排序),
然后我们可以用这个类作为参数来初始化set容器:
这样容器内容输出为:“B“,”A",而不是默认情况下的"A","B"