函数对象

    xiaoxiao2021-03-25  77

    一个函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。举个最简单的例子: [cpp]  view plain  copy class FuncObjType   {   public:       void operator() ()       {           cout<<"Hello C++!"<<endl;       }   };   类FuncObjType中重载了“()”操作符,因此对于一个该类的对象FuncObjType val,可以这样调用该操作符:val()。调用结果即输出以上代码中的内容。该调用语句在形式上跟以下函数的调用完全一样: [cpp]  view plain  copy void val()   {       cout<<"Hello C++!"<<endl;   }  

     

           既然用函数对象与调用普通函数有相同的效果,为什么还有搞这么麻烦定义一个类来使用函数对象?主要在于函数对象有以下的优势:

           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"

    转载请注明原文地址: https://ju.6miu.com/read-38609.html

    最新回复(0)