函数指针
-
函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。
-
用途:用作调用函数和做函数的参数。
-
声明方法:数据类型标志符 (指针变量名) (形参列表)
int (*func) (int x);
这里的(*func)不能去掉括号,去掉括号就是返回值为int指针的函数声明。 -
一般用typedef:
typedef int (*PF) (int x); PF pf;
-
用法示例:
typedef void (*PFT) (int &); void bar(int &i) { i++; return ; } int main() { PFT pft=bar; std::vector<int> ivec{3, 4, 2, 8, 15, 267}; std::for_each(ivec.begin(), ivec.end(), bar); return 0; }
-
优点:使程序更加清晰易懂,编码方便。函数指针是C推崇的,也是鲜明的C的特征。
函数对象
-
函数对象,从名字上可以看到是一个对象,它本质上就是一个类对象,但是它的功能和函数极为相似。所以我们将他称为函数对象。通常的做法是定义一个
struct
或者class
,并重载它的operator()
即可。 -
用途:可以等效为函数指针,但比它更强大。
-
用法:
class Inc { public: void operator()(int& a) { ++a; } };
Inc()就是一个函数对象了。实际上就是调用Inc().()
std::for_each(ivec.begin(), ivec.end(), Inc());
- 优点:
-
相比函数指针,性能更高。因为调用Inc()的operator()实质上是调用这个类成员的成员函数,而这个成员函数默认是inline的。但函数指针就是普通的调用函数,效率低。(这里要知道inline内联函数的优势)
-
相比函数指针,可以记录函数状态,即我们不用全局变量就可以达到记录状态的功能,并且更加安全。
//函数对象 class Countfrom { private: int &count; public: Countfrom(int& n):count(n) { } int operator()() { return count++; } }; // 函数指针 int s = 10; int fCountfrom() { return s++; } int main() { int state(10); int ar[11]; std::generate_n(ar,11,Countfrom(state)); // std::generate_n(ar,11,fCountfrom); for(int i = 0; i < 11; ++i) std::cout<<ar[i]<<std::endl; system("pause"); }
-
- 故我们可以在函数对象内部,定义自己的成员变量,这大大增加了灵活性。