函数对象
函数对象其实本身并不神秘,简单来说,一个函数对象就是能够被以函数调用形式来进行调用的任意对象。可以想到,函数对象就应该包括函数名,函数指针以及重载了()运算符的类对象。
函数指针
函数指针本身也是一个指针。需要知道的是,本质上看,函数其实跟普通的变量一样,都是一个符号,只是说这个符号的功能比较特殊。不必多说,我们先来看一下简单的函数指针的声明方式。
一般来说,函数指针是一对一绑定的,这是因为函数指针本身的类型声明比较麻烦的原因。
假设我们现在拥有这么一个函数
1 | int add(int a, int b) { |
我们想要定义一个函数指针来指向这个函数,那么我们得先确定我们要使用的这个函数指针所要指向的函数形式来进行声明,简单来看,一个函数指针需要一下这些信息:(函数的返回类型,函数的所有参数类型)。并通过这样来进行声明。
1 | int (*func_ptr)(int, int); // 定义一个函数指针 |
通过这种定义,我们就定义了一个能够指向返回类型为int,拥有俩个int参数的函数的函数指针。
再用文字来重复一遍,一个函数指针的声明由(函数返回类型,(*函数指针符号名)(函数参数返回类型枚举))来组成。
- 函数指针的使用
函数指针相对于其他符号来说有点不同,重点就是他可以通过()来直接调用该函数指针指向的函数。
来看一个小demo
1 |
|
但其实这种使用情况是很少见的,毕竟你完全可以通过函数本身去进行调用,至于那些个类函数,那你更不应该通过函数指针来进行调用,更多的是将函数指针来作为函数参数的传递来实现更多的扩展。这个之后碰到再说。
在stl中,函数符的概念已经被定义了,如下
- 生成器是不用参数能直接调用的函数符
- 一元函数是用一个参数就可以调用的函数符
- 二元函数是用一个参数就可以调用的函数符
- 返回bool值的一元函数是谓词
- 返回bool值的二元函数是二元谓词
来看一下最常用的stl库排序函数sort函数,这个函数前面俩个参数使用的是俩个迭代器,第三个参数时一个谓词(应该是一个二元谓词,毕竟需要将俩个数进行比较)