【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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值