函数对象以及其特点

一、函数对象以及其特点

  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!\n"; 
}

 

posted @ 2019-03-26 00:00  星星之火可以燎源  阅读(401)  评论(0编辑  收藏  举报