C++类重载 operator()

文章目录

    • 一、代码举例
    • 二、重载operator()作用
    • 三、优势
    • 四、使用举例
      • 1)当callback函数使用,用以通用操作
      • 2)谓词函数
    • 五、注意事项

一、代码举例

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

二、重载operator()作用

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

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

三、优势

与普通函数相比,函数对象(仿函数)比普通函数更加灵活,函数对象的优势:
1)函数对象可以有自己的状态。我们可以在类中定义状态变量,这样一个函数对象在多次的调用中可以共享这个状态;
2)函数对象有自己特有的类型。我们可以传递相应的类型作为参数来实例化相应的模板,比如说带参数的函数形参。

四、使用举例

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; 
}

2)谓词函数

谓词函数通常用来对传进来的参数进行判断,并返回布尔值。但是一般的函数形式固化,比如字符串长度比较只能判断是否大于一个确定的长度值。函数对象可以作为谓词函数,并可以在类初始化时传递参数,如字符串长度参考值,因此函数对象比普通函数更加灵活。

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++,1024程序员节)