zoukankan      html  css  js  c++  java
  • 函数对象以及其特点

    一、函数对象以及其特点

      1、函数对象:在一个类里面实现()运算符重载;

      2、函数对象的()的执行,很像一个函数//仿函数

      3、函数对象的好处:函数对象属于类对象,能突破函数的概念,能保持调用状态信息,如:for_each算法中,函数对象做函数参数,函数对象做返回值

    #include "pch.h"
    #include <iostream>
    #include"vector"
    #include<algorithm>
    using namespace std;
    
    //1.函数对象:在一个类里面实现()运算符
    template <typename T>
    class showElemt
    {
    public:
        showElemt()
        {
            n = 0;
        }
        void operator()(T &t)
        {
            n++;
            //printN();
            cout << t << " ";
    
        }
        void printN()
        {
            cout << "n:"<< n << endl;
        }
    protected:
        int n;
    };
    
    //函数模板
    template <typename T>
    void funcShowElemt(T &t)
    {
        cout << t << endl;
    }
    
    void funcShowElemt2(int &t)
    {
        cout << t << " ";
    }
    void test01()
    {
        int a = 10;
        showElemt<int> showelemt;
        showelemt(a);//2.函数对象的()的执行,很像一个函数//仿函数
        funcShowElemt<int>(a);
        funcShowElemt2(a);
    
        return;
    }
    //3.函数对象的好处:
    //函数对象属于类对象,能突破函数的概念,能保持调用状态信息
    //如:for_each算法中,函数对象做函数参数,函数对象做返回值
    void test02()
    {
        vector<int> v1;
        v1.push_back(1);
        v1.push_back(3);
        v1.push_back(5);
    
        for_each (v1.begin(), v1.end(), showElemt<int>());//匿名函数对象,匿名仿函数
        cout << endl;
        for_each(v1.begin(), v1.end(), funcShowElemt2);//通过回调函数,谁使用for_each,谁去填写回调函数的入口地址
        cout << endl;
    
        showElemt<int> show1;
        /*_Fn for_each(_InIt _First, _InIt _Last, _Fn _Func)
        {    // perform function for each element [_First, _Last)
        _Adl_verify_range(_First, _Last);
        auto _UFirst = _Get_unwrapped(_First);
        const auto _ULast = _Get_unwrapped(_Last);
        for (; _UFirst != _ULast; ++_UFirst)
            {
            _Func(*_UFirst);
            }
        return (_Func);
        }*/
        show1 = for_each(v1.begin(), v1.end(), show1);//此处函数对象做值传递,不是引用//返回值用匿名对象赋值给show1
        show1.printN();
    
    }
    int main()
    {
        //test01();
        test02();
        std::cout << "Hello World!
    "; 
    }
  • 相关阅读:
    C#中的委托和事件的使用
    C#中Attribute/特性的使用
    Eclipase + CDT
    设计模式总结
    Nginx源码编译
    Nginx自定义扩展模块
    电池的寿命
    大盗阿福
    河中跳房子
    An Easy Problem
  • 原文地址:https://www.cnblogs.com/jly594761082/p/10597727.html
Copyright © 2011-2022 走看看