标签:
指向函数地址的指针变量,声明方式如下:
一般函数:void func(void);
指向函数func(void)的指针:void (*pfunc)(void) = func;
其中(*func)必须带有括号,否则编译器会认为是返回类型为void*的func(void)函数。
1 #include <iostream> 2 using namespace std; 3 4 int array[10]; 5 6 // 1 定义数组类型 7 typedef int (ArrayType)[10]; 8 9 // 2 定义一个数组指针类型 10 typedef int (*pArrayType)[10]; // 注意指针的步长 11 12 // 3 函数指针 13 int func(int a) 14 { 15 cout << "传入的值为:" << a << endl; 16 return a; 17 } 18 19 // 3.1 定义函数类型 20 typedef int (funcType)(int); 21 // 3.2 直接定义函数指针 22 int (*pfunc)(int) = func; 23 // 3.3 定义一个指向函数类型的指针类型 24 typedef int (*PF)(int); 25 26 // 3.4 函数指针做函数参数时,被调函数通过这个指针调用外部函数,从而形成回调 27 int libfun(int (*pff)(int a)) 28 { 29 int x; 30 x = 10000; 31 pff(x); 32 } 33 34 int main() 35 { 36 cout << "hello, func pointer..." << endl; 37 // 1 38 ArrayType array; // 相当于int array[10]; 39 array[0] = 1; 40 // 2 41 pArrayType p; 42 p = &array; // 也可以直接定义:int (*p)[10] = &array; 43 (*p)[1] = 2; 44 45 // 3.1 用函数类型定义一个指向函数的指针 46 funcType* fp = NULL; 47 fp = func; // 函数名称代表函数的入口地址( 注意:func==&.&.(&func)==*.*.(*func) ) 48 // 通过函数指针调用函数 49 fp(5); 50 51 // 3.2 52 pfunc(10); 53 54 // 3.3 55 PF pf = func; 56 (*pf)(15); 57 58 // 3.4 59 int (*pff)(int a) = func; 60 libfun(pff); 61 62 return 0; 63 }
首先需要明确函数对象是一个对象,也就是一个类的实例,只不过这个对象具有某个函数的功能。具体实现时,只需要重载这个对象的()操作符即可:
1 #include <iostream> 2 using namespace std; 3 4 class Demo 5 { 6 public: 7 int operator()(int x){ return x; } 8 }; 9 10 int main() 11 { 12 Demo d; 13 cout << d(100) << endl; 14 15 return 0; 16 }
C++中的函数对象可以类比于C中的函数指针,一般而言,C中用函数指针的地方,在C++中就可以用函数对象来代替:
#include <iostream> using namespace std; class Demo { public: int operator()(int x){ return x; } public: template<typename T> T operator()(T t1, T t2) { cout << t1 << " + " << t2 << " = " << t1 + t2 << endl; return t1 + t2; } }; template<typename T> T addT(T t1, T t2, Demo& dd) /* 函数对象作为函数参数传递 */ { return dd(t1, t2); } int main() { Demo d; cout << d(100) << endl; Demo dd; /* 定义函数对象 */ addT(100, 200, dd); /* 函数对象的使用 */ addT(100.5, 200.7, dd); return 0; }
标签:
原文地址:http://www.cnblogs.com/benxintuzi/p/4612863.html