<九>函数对象
函数对象 =》C语言中的函数指针
函数对象
尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象。函数对象(也称“函数符”)是重载了“()”操作符的普通类对象。因此从语法上讲,函数对象与普通的函数行为类似。
用函数对象代替函数指针有几个优点:
首先,因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。在使用普通函数时需要将先前调用的结果存储在全程或者本地静态变量中,但是全程或者本地静态变量有某些我们不愿意看到的缺陷。
其次,在函数对象中编译器能实现内联调用,从而更进一步增强了性能。这在函数指针中几乎是不可能实现的。
C++11还提供了limbda表达式来实现函数的灵活调用
为什么要用函数对象呢?
上图中 return comp(a,b);通过函数指针调用函数是没有办法内联的,效率低,因为有函数调用开销,C++通过函数对象解决
template<typename T>
class mygreater
{
public:
bool operator()(T a,T b){
return a>b;
}
};
template<typename T>
class myless
{
public:
bool operator()(T a,T b){
return a<b;
}
};
template<typename T ,typename Compare>
bool compare(T a,T b,Compare comp)
{
return comp(a,b);
}
compare(10,20,mygreater<int>());
compare(10,20,myless<int>());
1:通过函数对象调用operator()可以省略函数的调用开销比通过函数指针调用函数(不能够inline内联调用) 效率高
2:因为函数对象是用类生成的,所以可以添加想关的成员变量,用来记录函数对象的使用信息