【STL】 19 函数对象基本概念

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

//函数对象  VS  普通函数 

struct MyPrint01{
    
    MyPrint01(){
        mNum = 0;
    } 
    void operator ()(int val){
        mNum++;
        cout<<val<<endl;
    }
    public:
        int mNum;
};

//num计算函数调用次数 
int num = 0;         //在真正开发中,尽量避免去使用全局变量!! 增加加锁解锁的工作 
void MyPrint02(int val){     //普通函数的局限性 
    num++;
    cout<<val<<endl;
}

    
    //函数对象可以像普通函数一样调用
    //函数对象可以像普通函数那样接收参数
    //函数对象超出了函数的概念
    //函数对象可以保存函数调用的状态 


void test01(){
    
    vector<int> v;
    v.push_back(10);    
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    
    //for_each(v.begin(),v.end());
    
#if 0    
    MyPrint02(10);
    MyPrint02(20);
    cout<<num<<endl;
    
    MyPrint01 print;
    print(30);
    print(40);
    cout<<print.mNum<<endl;
#endif
    
    MyPrint01 print01;
    //for_each()返回的是第三个参数的类型,即print01的类型
    //但 for_each()内部将对print01进行拷贝构造,所以不是对print01对象进行操作
    MyPrint01 print02 = for_each(v.begin(),v.end(),print01); 
     
    cout<<"print调用次数"<<print01.mNum<<endl;  //返回  次数 0 (拷贝构造) 
    cout<<"print调用次数"<<print02.mNum<<endl;  //返回  次数 4 (实际返回) 
     

int main(){
    test01();
    return 0;
}

相关文章: