顾名思义,函数指针是一个指向函数的指针,该指针存放了函数的地址,地址中有着函数名,函数参数等信息,其基本语法如下:
c++函数指针的定义形式:返回类型 (类名称::*函数成员名称)(参数类型,参数类型,参数类型,….);
对于函数指针的使用,以上篇中Qt的信号槽为例,我们可以写为:
int MainWindow::FunPoint()
{
qDebug() << "FunPoint";
return 0;
}
int (MainWindow::*myFunPoint)() = &MainWindow::FunPoint;
connect(ui->pushButton,&QPushButton::clicked,this,myFunPoint);
另一种方法可以使用typedef来简化写法:
typedef int(MainWindow::*pFun)();
pFun pfun = &MainWindow::FunPoint;
connect(ui->pushButton,&QPushButton::clicked,this,pfun);
这种写法是将该函数指针类型(即返回值为int,参数为空的MainWindow类的成员函数类型)定义为pFun,然后我们定义一个pFun类型的指针pfun指向该成员函数
除了返回一般类型,函数指针还可以指向返回函数指针的函数,这种情况下写法为:
int (*ReturnFunPoint(int))(int*, int);
我们从声明的名字由里向外理解:
ReturnFunPoint(int); //它是一个带有int形参的函数
然后我们再看外层结构:int (*)(int* ,int) //它是一个函数指针,返回值为int,形参为int类型的指针和int
将两者结合起来看就是一个函数指针,该函数指针指向一个形参为int,返回值为一个函数指针(该函数指针返回值为int,形参为int类型的指针和int)的函数
上一种写法过于晦涩难懂,我们推荐使用typedef定义返回的函数指针,便于理解:
typedef int (*FunPoint)(int*, int);
FunPoint fPoint(int); // fPoint 返回一个函数指针
综合以上,我个人比较倾向于使用typedef定义函数指针,这可使得代码便于理解与阅读