函数指针的用法

函数指针的用法

在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;

  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119437.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux下查看memcache是否正常

    linux下查看memcache是否正常

  • jenkins拉取gitlab代码_git强制覆盖远程仓库代码

    jenkins拉取gitlab代码_git强制覆盖远程仓库代码前言python自动化的脚本开发完成后需提交到git代码仓库,接下来就是用Jenkins拉取代码去构建自动化代码了新建项目打开Jenkins新建一个自由风格的项目源码管理Repository

  • 我的Android进阶之旅——>Android ListView 应用解析(使用ArrayAdapter,SimpleAdapter和SimpleCursorAdapter适配器)…

    我的Android进阶之旅——>Android ListView 应用解析(使用ArrayAdapter,SimpleAdapter和SimpleCursorAdapter适配器)…

  • 搭建smtp邮件服务器_smtp服务器怎么填

    搭建smtp邮件服务器_smtp服务器怎么填4.“传递”选项卡在“默认SMTP虚拟服务器属性”对话框中点击“传递”选项卡,如图所示。该选项卡用来设定邮件一次发送不成功时,SMTP服务器如何处理这些邮件。在大多数情况下,每个虚拟服务器都尽量在消息一抵达消息队列后就进行发送;可是,如果下一个中继段的服务器发生了某个临时性的问题,或者网络中发生了某种通信故障,那么虚拟服务器就会采取适当的措施,例如对消息进行排队,准备再次重试,或者变更消息路由。如…

  • cmd炫酷代码大全「建议收藏」

    cmd炫酷代码大全「建议收藏」事先准备:新建一个txt,后缀名改成cmd(或bat)里面写代码即可声明:文章目录cmd炫酷代码大全1.循环类1.1.黑客王国1.2.命令tree1.3.我是这条街,这条街,最靓的仔1.4.数字点阵1.5.数字王国加强版2.其他类2.1.观看星球大战完结cmd炫酷代码大全1.循环类1.1.黑客王国coloraechooff:123echo0101010010100101010101010101010101010101010101010101001010101echo10101

  • 微表情识别

    表情识别2019.12更新了仓库依赖。简介使用卷积神经网络构建整个系统,在尝试了Gabor、LBP等传统人脸特征提取方式基础上,深度模型效果显著。在FER2013、JAFFE和CK+三个表情识别数据集上进行模型评估。环境部署基于Python3和Keras2(TensorFlow后端),具体依赖安装如下(推荐使用conda或者venv虚拟环境)gitclonehttp…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号