#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;
}