<九>函数对象
  xs9mrAcZVTZn 2023年11月02日 46 0
C++

函数对象 =》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:因为函数对象是用类生成的,所以可以添加想关的成员变量,用来记录函数对象的使用信息

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   82   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   58   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   44   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   62   0   0 C++
xs9mrAcZVTZn