zoukankan      html  css  js  c++  java
  • 函数指针

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

    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函数指针用法

    原来人类的悲欢并不相通, 我只觉得他们吵闹。
  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/zhlabcd/p/11286804.html
Copyright © 2011-2022 走看看