一、函数指针
在C++中,指针本质就是内存中的某个地址,如果该内存地址中存放的是某个数据,那么这个指针就是常见的数据指针,如果这个内存地址中存放的是某个函数,那么这个指针就是函数指针。
C++中每一个函数都有一个入口地址,该入口地址就是函数指针所指向的内存地址,有了指向函数的指针变量后,就可以用这个函数指针变量调用函数,如果用数据指针变量可以引用它所指向的数据一样。
C++代码经过编译后,每一个函数都有一个入口地址,而函数名就代表这个入口地址。
函数指针声明语法:
函数返回值类型标识符 (指针变量名)(形参列表)
如:
void PrintPass(int nScore);
如果要声明一个函数指针指向这个函数,则:
void (*pPrintFunc)(int nScore);
或
void (*pPrintFunc)(int);//省略形参名
函数指针的赋值可以直接通过将函数名赋值给函数指针名完成,也即函数名就是指向函数的指针:
pPrintFunc = PrintPass;
函数指针用处:
1、使用函数指针简化调用函数过程
通过将不同函数对函数指针进行赋值,最终统一调用函数指针变量,实现统一接口调用不同函数的目的,简化函数调用过程;
2、使用函数指针实现回调函数
二、函数对象
函数对象( functor 或者 funtion objects )
#include<functional>
函数对象又称之为仿函数。
所谓函数对象,就是定义了函数调用操作符(function-call operator),即operator()的普通类的对象。
函数对象将函数封装在一个对象(其实是定义一个重载了operator()的普通类)中,使得它可作为参数传递给合适的STL 算法,从而使算法的功能得以扩展。
函数对象是一种设计成具有类似函数功能类的对象。在C++中,这可以在类中定义成员函数operator()来实现。
定义好函数对象类之后,就可以开始使用函数对象类创建相应的函数对象,并利用这些函数对象来进行具体的计算。函数对象作为一个具体的类的实例变量,它既可以单独使用,也可以像函数指针一样被当成参数传递给其他函数,并在其他函数中使用。
https://blog.csdn.net/a20102110080212/article/details/11675497?readlog
用户可以定义自己的函数对象。下面让我们来定义一个自己的函数对象。
#include <iostream>
using namespace std;
struct int_max{
int operator()(int x,int y){return x>y?x:y; }
};//operator() 重载了" ()" , (int x,int y) 是参数列表
int main()
{
cout<<int_max() (3,4)<<endl;
return 0;
}
这里的 int_max () 就是一个函数对象, struct 关键字也可以用 class 来代替,只不过 struct 默认情况下是公有访问权限,而 class 定义的是默认私有访问权限。下面我们来定义一个STL 风格的函数对象: