zoukankan      html  css  js  c++  java
  • 函数对象

    一、函数对象的概念

    重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。

    注意:

    1、函数对象(仿函数)是一个类,不是一个函数。

    2、函数对象(仿函数)重载了“()”操作符使得它可以像函数一样调用。

    假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为“一元仿函数(unary function)”;相反,如果重载的operator()要求获取两个参数,我们就将这个类称为“二元仿函数(binary function)”

    二、案例:计算函数调用次数

    方法一:

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    //#include <algorithm>
    using namespace std;
    
    struct MyPrint
    {
        void operator()(int val)
        {
            cout << val << endl;
        }
    };
    
    int num = 0;//真正在开发中,尽量避免去使用全局变量
    void MyPrint02(int val)
    {
        num++;
        cout << val << endl;
    }
    
    void test01()
    {
        MyPrint print;
        print(10);//10
    
        //函数对象可以像普通函数一样调用
        //函数对象可以像普通函数那样接收参数
        //函数对象超出了函数的概念,函数对象可以保存函数调用的状态
    }
    
    void test02()
    {
        //计算函数调用次数
        MyPrint02(10);//10
        MyPrint02(20);//20
        MyPrint02(30);//30
        MyPrint02(40);//40
        cout << "print调用次数:" << num << endl;//print调用次数:4
    }
    int main(void)
    {
        //test01();
        test02();
        return 0;
    }

    方法二:

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    struct MyPrint
    {
        MyPrint()
        {
            mNum = 0;
        }
        void operator()(int val)
        {
            mNum++;
            cout << val << endl;
        }
    public:
        int mNum;
    };
    
    void test01()
    {
        MyPrint print;
        print(10);//10
                  //函数对象可以像普通函数一样调用
                  //函数对象可以像普通函数那样接收参数
                  //函数对象超出了函数的概念,函数对象可以保存函数调用的状态
    }
    
    void test02()
    {
        vector<int> v;
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
        v.push_back(40);
    
        //计算函数调用次数
        MyPrint print;
        MyPrint print02 = for_each(v.begin(), v.end(), print);//for_each返回值为print的类型,即MyPrint
                                                              //10
                                                              //20
                                                              //30
                                                              //40
        cout << "print调用次数:" << print.mNum << endl;//0
        cout << "print调用次数:" << print02.mNum << endl;//4
    }
    int main(void)
    {
        //test01();
        test02();
        return 0;
    }
  • 相关阅读:
    [推荐]大量 Blazor 学习资源(二)
    [翻译]欢迎使用C#9.0
    重磅消息:微软发布多平台应用UI框架 MAUI,网友直呼:牛x
    如何对Git的分支进行管理
    如何使用JPA的@Formula注解
    伤其十指,不如断其一指,谈谈我的学习计划
    如何使用Swagger-UI在线生成漂亮的接口文档
    如何在Linux服务器上部署jar包
    使用PageHelper插件分页时,如何对对象进行转换以及添加属性
    在Java中使用Collections.sort 依据多个字段排序
  • 原文地址:https://www.cnblogs.com/yuehouse/p/10115601.html
Copyright © 2011-2022 走看看