函数指针的用法

函数指针的用法

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

  

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • GoogLeNet系列解读「建议收藏」

    GoogLeNet系列解读「建议收藏」本文介绍的是著名的网络结构GoogLeNet及其延伸版本,目的是试图领会其中的思想而不是单纯关注结构。GoogLeNetIncepetionV1MotivationArchitecturalDetailsGoogLeNetConclusionGoogLeNetInceptionV2IntroductionGeneralDesignPrinciplesFactorizi

    2022年4月19日
    786
  • UNIX命令

    UNIX命令 一、UNIX命令格式1、UNIX命令提示符   在命令行下,操作系统会显示一提示符,提示用户在此提示符后可以输入一行命令。不同的Shell有不同的缺省提示符:       BShell和KShell的缺省提示符为”$”;       CShell的缺省提示符为”%”;       但当以root用户登录时,系统提示符统一缺省为”#”。用户可以更改自己的缺省Shell和提

    2022年6月1日
    34
  • ThreadPoolTaskExecutor线程池参数配置

    ThreadPoolTaskExecutor线程池参数配置一、线程池配置1、ThreadPoolConfigimportorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.scheduling.concurrent.Threa

    2022年5月4日
    306
  • 遍历ArrayList的过程中移除元素的方式

    遍历ArrayList的过程中移除元素的方式错误方法一使用for循环正序遍历ArrayList,使用remove移除元素结果如下,只删除了一个“3”原因:在匹配到第一个要删除的元素并移除时,后面元素会往前移位,导致索引位置改变,从而漏掉后面一个元素。publicstaticvoidmain(String[]args){ ArrayList<String>list=newArrayList<>(); list.add(“1”); list.add(“2”); list.add(“3”

    2022年7月22日
    10
  • java trylock_lock.tryLock()方法的使用

    java trylock_lock.tryLock()方法的使用packageconcurrent;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassTestTryLock{privateListlist=…

    2022年10月16日
    3
  • Python画图[通俗易懂]

    Python画图[通俗易懂]帮别人实现rubberfriction的运算公式。公式不是我专业的内容,完全不懂,只是照着公式用python计算并画图。做出的图,与论文中的图进行对比,完全一致。之所以用python,是因为mat

    2022年7月5日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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