函数调用运算符

如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。因为这样的类同时也能储存状态,所以与普通的函数相比它们更加灵活。

class absInt
{
public:
    int operator()(int val) const
    {
        return (val < 0)?-val : val;
    }
};

int main()
{
    int i = -42;
    absInt absObj;
    int ui = absObj(i);
    cout << ui << endl;
}

  即使absObj只是一个对象而非函数,我们也能“调用”该对象。调用对象实际上是在运行重载的调用运算符。在此例中,该运算符接受一个int值并返回其绝对值。

  如果类定义了调用运算符,则该类的对象称作函数对象(function object)。因为可以调用这种对象,

含有状态的函数对象类

  和其它类一样,函数对象除了operator()之外也可以包含其它成员。函数对象类通常含有一些数据成员,这些成员被用于定制调用运算符中的操作。

class printString
{
public:
    printString(ostream &o = cout, char c = ' ') : os(o), sep(c) {}
    void operator()(const string &s) const {os << s << sep;}
private:
    ostream &os;
    char sep;
};

int main()
{
    printString printer;
    printer(s);
    printString errors(cerr, '\n');
    errors(s);
}

  函数对象常常作为泛型算法的实参。例如,可以使用标准库for_each算法和我们自己的printString类来打印容器的内容:

for_each(vs.begin(), vs.end(), printString(cerr, '\n'));

  for_each的第三个实参是类型printString的一个临时对象,其中我们用cerr和换行符初始化了该对象。当程序调用for_each时,将会把vs中的每个元素依次打印到cerr中,元素之间以换行符分割。

转载于:https://www.cnblogs.com/bootblack/p/11368778.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值