C++ operator()(重载小括号符)

最近阅读C++代码时看到这样的代码,没太理解,于是百度了解了一下,特此记录备忘。

class ClassAction
{
public:
    void operator()(){
    ......
    }
private:
    int dataValue;
}

参考

  1. https://blog.csdn.net/jinzhu1911/article/details/101317367
  2. https://blog.csdn.net/xgf415/article/details/52966475?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

c++类可以重载()【即小括号符】,来实现仿函数,或者叫函数对象。那么这个类可以行使函数的功能,用以优雅的实现一些功能。

基本使用方式

class FuncClass
{
public:
    void operator()(const string& str) const
    {
        std::cout << str << std::endl;
    }
}; 
int main() 
{ 
    FuncClass myFuncClass; 
    myFuncClass("hello world"); 
}

与普通函数相比,函数对象(仿函数)比普通函数更加灵活,函数对象的优势:

  • 函数对象可以有自己的状态。我们可以在类中定义状态变量,这样一个函数对象在多次的调用中可以共享这个状态;
  • 函数对象有自己特有的类型。我们可以传递相应的类型作为参数来实例化相应的模板,比如说带参数的函数形参。

例子

  1. 当callback函数使用,用以通用操作
class ShorterThan 
{ 
public: 
    explicit ShorterThan(int maxLength):length(maxLength) 
    {} 
    bool operator() (const string& str) const 
    { 
            return str.length() < length; 
    } 
private: 
    const int length; 
}; 
int main() 
{ 
    vector myVec; 
    myVec.push_back("Jack"); 
    myVec.push_back("Llihass"); 
    myVec.push_back("tTT"); 
    int result = count_if(myVec.begin(), myVec.end(), ShorterThan(4)); 
    cout << "count: " << result << endl; 
}
  1. 谓词函数
    谓词函数通常用来对传进来的参数进行判断,并返回布尔值。但是一般的函数形式固化,比如字符串长度比较只能判断是否大于一个确定的长度值。函数对象可以作为谓词函数,并可以在类初始化时传递参数,如字符串长度参考值,因此函数对象比普通函数更加灵活。
class Upper 
{ 
public: 
    Upper(int min = 0):m_min(min)
    {} 
    bool operator() (int value) const 
    { 
            return value >= m_min; 
    } 
private: 
    int m_min; 
};
int main()
{
    vector intVec;
    intVec.push_back(10);
    intVec.push_back(6);
    intVec.push_back(12);
    vector::iterator targetIterator = find_if(intVec.begin(), intVec.end(), Upper(10));
    if (targetIterator != intVec.end())
    {
        cout << "value: " << *targetIterator << endl;
    }
}

首先生成类 Upper 的对象,并用 10 初始化,调用find_if 时将用该函数对象进行判断。

请注意:在调用用到函数对象的标准库算法时,除非显式地指定模板类型为传引用,否则默认情况下函数对象是按值传递的!因此,如果传递一个具有内部状态的函数对象,则被改变状态的是函数内部被复制的临时对象,函数结束后随之消失。真正传进来的函数对象状态并为改变

你可能感兴趣的:(C++ operator()(重载小括号符))