既然用函数对象与调用普通函数有相同的效果,为什么还有搞这么麻烦定义一个类来使用函数对象?主要在于函数对象有以下的优势:
1. 函数对象可以有自己的状态。我们可以在类中定义状态变量,这样一个函数对象在多次的调用中可以共享这个状态。但是函数调用没这种优势,除非它使用全局变量来保存状态。呃,面向对象编程。。。全局变量。。。。
2. 函数对象有自己特有的类型,而普通函数无类型可言。这种特性对于使用C++标准库来说是至关重要的。这样我们在使用STL中的函数时,可以传递相应的类型作为参数来实例化相应的模板,从而实现我们自己定义的规则。比如自定义容器的排序规则。
举几个使用函数对象的典型的例子:
第一个即自定义容器set对字符串string的排序规则。首先来定义相应的类并重载 “()” 来规定排序(这里我们按从大到小排序),
[cpp] view plain copy class StringSort { public: bool operator() (const string &str1, const string &str2) const { return str1 > str2; } };然后我们可以用这个类作为参数来初始化set容器:
[cpp] view plain copy set<string,StringSort> myset; myset.insert("A"); myset.insert("B");这样容器内容输出为:“B“,”A",而不是默认情况下的"A","B"