函数指针
从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。
void bar(char ch, int i) { cout << "bar " << ch << ‘ ‘ << i << endl; }
void (*pBar)(char,int); //定义一个指针变量 pBar=bar; //指针变量赋值 (*pBar)(‘H‘,3); //或者pBar(‘H‘,3);
使用typedef更加方便
形式1:typedef 返回类型(*新类型)(参数表)
typedef void (*PFT)(char,int); //定义了一种PFT的类型,并定义这种类型为指向某种函数的指针 PFT pft=bar; //定义指针变量pft并赋值 pft(‘H‘,3);
使用函数指针作为函数参数
void foo(char ch,int i,PFT pf) { pf(ch,i); }
PFT pft = bar; //定义函数指针变量 foo(‘H‘, 91, pft);
从一般的函数回调意义上来说,函数对象和函数指针是相同的,但是函数对象却具有许多函数指针不具有的特点,函数对象使程序设计更加灵活,而且能够实现函数的内联(inline)调用,使整个程序实现性能加速。
函数对象:这里已经说明了这是一个对象,而且实际上只是这个对象具有函数的某些功能,我们才称之为函数对象,如何使对象具有函数功能呢,很简单,只需要为这个对象的操作符()进行重载就可以了,如下:
class A{ public: int operator()(int x){return x;} }; A a; a(5);
使用函数对象作为函数参数
可以在函数形参列表中调用函数对象,它完全可以取代函数指针!
当我们想在形参列表中调用某个函数时,可以先声明一个具有这种函数功能的函数对象,然后在形参中使用这个对象,他所作的功能和函数指针所作的功能是相同的,而且更加安全。
1 class Func 2 { 3 public: 4 int operator()(int a, int b) 5 { 6 int res = a + b; 7 cout << a << "+" << b << "="<<res<< endl; 8 return res; 9 } 10 }; 11 int addFunc(int a, int b, Func& func) 12 { 13 return func(a, b); 14 } 15 int main() 16 { 17 Func func; 18 int res = addFunc(2, 3, func); 19 cout << res << endl; 20 system("pause"); 21 return 0; 22 }
使用模板
1 class FuncT 2 { 3 public: 4 template <typename T> 5 T operator()(T a, T b) 6 { 7 T res = a + b; 8 cout << a << "+" << b << "=" << res << endl; 9 return res; 10 } 11 }; 12 template <typename T> 13 T addFuncT(T t1, T t2, FuncT& funct) 14 { 15 return funct(t1, t2); 16 } 17 int main() 18 { 19 FuncT funct; 20 addFuncT<double>(2.4, 3.67, funct); 21 system("pause"); 22 return 0; 23 }