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