• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++STL之函数对象

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。
注意:1.函数对象(仿函数)是一个类,不是一个函数。2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。
假定某个类有一个重载的 operator(),而且重载的 operator()要求获取一个参数,我们就将这个类称为“一元仿函数”(unary functor);相反,如果重载的 operator()要求获取两个参数,就将这个类称为“二元仿函数”(binary functor)。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class FuncObject01
{
public:
    void operator()()
    {
        cout << "Hello WOrld!" << endl;
    }
};

void FuncObject02()
{
    cout << "Hello WOrld!" << endl;
}

void test01()
{
    FuncObject01 fobj;
    fobj();
    FuncObject02();
    cout << "------------" << endl;
}

class FuncObject03
{
public:
    int operator()(int a, int b)
    {
        return a + b;
    }
};

int FuncObject04(int a, int b)
{
    return a + b;
}

// 函数对象也可以像普通函数一样 具有返回值和参数
void test02()
{
    FuncObject03 fobj;
    int ret = fobj(10, 20);
    cout << "ret = " << ret << endl;
    ret = FuncObject04(10, 30);
    cout << "ret = " << ret << endl;
    cout << "------------------------" << endl;
}

// 函数对象超出了普通函数的功能,可以具有保存函数调用状态
// 例如 我们要统计函数的调用次数

class FuncObject05
{
public:
    FuncObject05() : count(0) {}
    void operator()()
    {
        cout << "Hello World!" << endl;
        count++;
    }
    int count;
};

// 普通函数统计调用次数,需要一个全局变量
int g_count = 0;
void FuncObject06()
{
    cout << "Hello World!" << endl;
    g_count++;
}

void test03()
{
    FuncObject06();
    FuncObject06();
    cout << "函数调用次数:" << g_count << endl;
    // 使用函数对象不需要使用全局变量
    FuncObject05 fobj;
    fobj();
    fobj();
    fobj();
    cout << "函数调用次数:" << fobj.count << endl;
    cout << "---------------------------" << endl;
}

// 函数对象做参数和返回值
class print
{
public:
    print() : count(0){}
    void operator()(const int& val)
    {
        cout << val << " ";
        count++;
    }
    int count;
};

int num = 0;
void print2(int val)
{
    cout << val << " ";
    num++;
}

void test04()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(5);
    v.push_back(2);
    // 通过for_each算法 遍历容器元素
    print myprint;
    // 函数对象做返回值和参数
    myprint = for_each(v.begin(), v.end(), myprint);
    cout << endl;
    cout << "函数调用次数:" << myprint.count << endl;
    for_each(v.begin(), v.end(), print2);
    cout << endl;
    cout << "函数调用次数:" << num << endl;
}

int main()
{
    test01();
    test02();
    test03();
    test04();
    getchar();
    return 0;
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
VisualC#常用函数和字符串,获取IP汇总发布时间:2022-07-18
下一篇:
C#按位或,按位与,按位异或发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap