學習《C++ Primer》的筆記
函數指針的一種替代策略是Function object(函數對象)。
函數對象與函數指針相比較有兩個方面的優點:首先如果被重載的調用操作符是inline函數則編譯器能夠執行內聯編譯,提供可能的性能好處;其次函數對象可以擁有任意數目的額外數據,用這些數據可以緩沖結果,也可以緩沖有助于當前操作的數據。
函數對象是一個類,它重載了函數調用操作符operator() ,該操作符封裝了一個函數的功能。典型情況下函數對象被作為實參傳遞給泛型算法,當然我們也可以定義獨立的函數對象實例。
來看一個例子:
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
class Sum {
int val;
public:
Sum(int i) :val(i) { }
//當在需要int的地方,Sum將自動轉換為int類型
//這里是為了方便cout<<Sum的實例;
operator int() const { return val; }
//寫在類中的函數代碼一般默認為內聯代碼
int operator()(int i) { return val+=i; }
};
void f(vector<int> v)
{
Sum s = 0; //Sum s = 0等價于Sum s(0),不等價于Sum s;s = 0;
//對vector<int>中的元素求和
//函數對象被作為實參傳遞給泛型算法
s = for_each(v.begin(), v.end(), s);
cout << "the sum is " << s << "\n";
//更簡單的寫法,定義獨立的函數對象實例
cout << "the sum is " << for_each(v.begin(), v.end(), Sum(0)) << "\n";
}
int main()
{
vector<int> v;
v.push_back(3); v.push_back(2); v.push_back(1);
f(v);
system("pause");
return 0;
}