• 函数指针


    函数指针,顾名思义,就是指向函数的指针。那么如何声明一个函数指针呢:答案是返回值以及形参列表与原函数相同,再加个指针符号' * '就好了。

    bool lengthCompare(const string &, const string &);  //原函数
    
    bool (*pf)(const string &, const string &);   //指向函数lengthCompare的指针,未初始化

    如上所示。并且很容易知道,当我们把函数名作为一个右值使用时,此函数名会自动地转化为指针,当然,也可用取地址符(两者是等价的):

    pf = lengthCompare;
    pf = &lengthCompare;

    既然是等价的,那么自然而然就可以直接使用此指针函数(初始化后)直接调用该函数(而不用解引用):

    bool b1 = pf("hello", "goodbye");
    
    bool b2 = (*pf)("hello", "goodbye");
    
    bool b3 = lenthCompare("hello", "goodbye");
    
    //以上三个调用等价(pf由lengthCompare初始化)

     那么函数指针的出现有什么用呢?其中一个常见的用处就是用于重载函数的选择:当我们使用重载函数的时候,一般需要给定形参列表才能让编译器找到对应的函数,(未给定形参列表)而如果定义了指向重载函数的指针,就可以通过指针类型来决定使用哪个函数。(下面例子是Qt 的信号槽):

    QObject::connect(spinBox, &QSpinBox::valueChanged, silder, &QSlider::setValue);  
    /* 此时会报错,因为QSpinBox有两个同名函数信号:
    void valueChanged(int);
    void valueChanged(const QString &);
    */
    
    //解决这个问题的方法就是定义一个指向重载函数的指针
    
    void (QSpinBox::*spinBoxSignal)(int) = &QSpinBox::valueChanged; //第一个重载
    
    //此时调用connect, 将valueChanged变成spinBoxSignal即可

    另外,还有函数指针形参和返回指向函数的指针等知识点(可用typedef简化),这里暂时不赘述(还没怎么用过)

    参考:C++Primer 5th 6.7函数指针

      typedef函数指针用法

    原来人类的悲欢并不相通, 我只觉得他们吵闹。
  • 相关阅读:
    BIO、NIO、AIO有什么区别?
    java中IO流有哪些?
    List、Map、Set 三个接口,存取元素时,各有什么特点?
    Vector、ArrayList、LinkedList 的存储性能和特性?
    Java.util.Map的常用实现类有哪些?
    Java自学指南六、查一手资料
    虚拟机中Lvs配置
    m2014-software->Word2010发布博客文章至Cnblogs
    m2014-c->c模拟java的hashmap容器类
    m2014_c->c语言容器类工具列
  • 原文地址:https://www.cnblogs.com/zhlabcd/p/11286804.html
Copyright © 2020-2023  润新知