【C++】class的设计与使用(九)自定义函数对象(function object)

函数对象

  • 一种提供有函数调用运算符的类。

  • 当编译器遇到了一个函数调用,比如lt(ival);,lt可能是个函数名、函数指针、提供了函数调用运算符的的函数对象;
    如果lt是个类对象,那么编译器会在内部将此语句转换为lt.operator(ival);

  • 函数调用运算符可以接受任意个参数。使用举例:它可被用来支持矩阵(Matrix)这个类的多维度下标操作,因为语言所提供的下标运算符仅能接受一个参数。

//测试传入值是否小于指定值的实现

class LessThan
{
public:
    LessThan(int val):_val(val){};
    int comp_val()const
    {
        return _val;	//基值的读取
    }
    void comp_val(int nval)
    {
        _val=nval;	    //基值的写入
    }
    bool operator()(int value) const;
    
private:
    int _val;
};


//函数调用运算符的实现如下
inline bool LessThan::operator()(int value) const
{
    return value<_val;
}

//将函数调用运算符应用于对象身上,便可以调用函数调用运算符:
int count_less_than(const vector<int>&vec,int comp)
{
    LessThan lt(comp);
    
    int count=0;
    for(int ix=0;ix<vec.size();ix++)
        if(lt( vec[ix] ))
            ++count;
    
    return count;
}

//通常我们会把函数对象当作参数传给泛型算法,例如:
void print_less_than(const vector<int>&vec,int comp,ostream &os)
{
    LessThan lt(comp);
    vector<int>::const_iterator iter = vec.begin(),it_end=vec.end();
    os<<"elemts less than "<<lt.comp_val()<<endl;
    while((iter = find_if(iter,it_end,lt)) != it_end)
    {
        os<< *iter <<' ';
        ++iter;
    }
}


//练习以上两个函数
int main()
{
    int ia[16]={17, 12, 44, 9, 18, 45, 6, 14, 23, 67, 9, 0, 27, 55, 8, 16};
    vector<int>vec(ia, ia+16);
    int comp_val=20;
    
    cout << "Numeber of elements less than "
    	 << comp_val << " are "
    	 << count_less_than(vec,comp_val) << endl;

    print_less_than(vec,comp_val);
}

//执行结果
//Numeber of elements less than 20 are 10
//elements less than 20
//17 12 9 18 6 14 9 0 8 16

你可能感兴趣的:(C++基础,c++,笔记,开发语言)