在 C++ 编程的时候, 有时候我在考虑, 如果把一个函数能够当作一个变量, 被调用, 传递就会方便很多, 之前学习了 lambda 表达式, 用 lamda 表达式会比较方便. 下面可以介绍一种新的方法, 函数指针.
函数指针用例
- int add(int a,int b){
- return a+b;
- }
- void Widget::on_pushButton_clicked()
- {
- int (*pfunc)(int a,int b);
- pfunc = add;
- qDebug()<<pfunc(1,2)<<endl;
- }
如上, 通过一个简单了例子, 可以看到函数指针的声明以及赋值, 应用的过程. 可以将例子变得复杂一点:
- int add(int a,int b){
- return a+b;
- }
- void Widget::on_pushButton_clicked()
- {
- QMap<QString,int(*)(int,int)> toTest;
- toTest["test"] = add;
- qDebug()<<toTest["test"](1,2)<<endl;
- }
如果想要 add 函数为类中的非静态成员函数, 代码可以写成:
- widget.h
- int add(int a,int b);
- QMap<QString,int(Widget::*)(int,int)> toTest;
- widget.cpp
- int Widget::add(int a,int b){
- return a+b;
- }
- void Widget::on_pushButton_clicked()
- {
- toTest["test"] = add;
- qDebug()<<(this->*toTest["test"])(1,2)<<endl;
- }
如果 add 函数声明为静态成员函数, 就方便多了.
- widget.h
- static int add(int a,int b);
- widget.cpp
- int Widget::add(int a,int b){
- return a+b;
- }
- void Widget::on_pushButton_clicked()
- {
- QMap<QString,int(*)(int,int)> toTest;
- toTest["test"] = add;// 用 & add 也行
- qDebug()<<toTest["test"](1,2)<<endl;
- }
当我们把函数名作为一个右值使用时, 此函数名会自动地转化为指针, 当然, 也可用取地址符 (两者是等价的):
- toTest["test"] = add;
- toTest["test"] = &add;
来源: http://www.bubuko.com/infodetail-3362889.html