NO.0 类中成员函数指针/以及&ClassName::Func和ClassName::Func的相关

发布于 2022-05-08  691 次阅读


类中成员函数指针,最近学习QT的时候发现 信号 和 槽 有两种实现方法:

QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)//SIGNAL() 和 SLOT() 宏实现

QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)//类成员函数指针实现

sender: 信号类指针

signal: 1.信号函数, 此处应用SIGNAL()宏实现 2.sender类成员函数指针

receiver: 槽类指针

method: 1.槽函数, 此处应用SLOT()宏实现 2.receiver类成员函数指针

type: 关联方式, 默认AutoConnection

//两个例子
QObject::connect(&but, SIGNAL(clicked()),&but,SLOT(hide()));//宏实现

QObject::connect(&But, &QPushButton::clicked, &widget, &QWidget::close);//类成员函数指针实现

在学习类成员函数指针实现时发现,&符号是否存在不影响结果的存在。

//测试代码
#include<iostream>

using namespace std;

class className
{
public:
    className(int value = 0):value(value){};
    void setValue(int);
    void getValue();
private:
    int value;
};
void className::setValue(int value)
{
    this->value = value;
}
void className::getValue()
{
    cout << this->value << "\n";
}

int main()
{
    //函数指针无&
    //void (className::*classMemberPoint)(int) = className::setValue;
    //函数指针有&
    void (className::*classMemberPoint)(int) = &className::setValue;
    className *classPoint = new className();//创建并初始化类指针
    classPoint->getValue();
    //类指针实现
    (classPoint->*classMemberPoint)(100);
    classPoint->getValue();
    //类变量实现
    (*classPoint.*classMemberPoint)(50);
    (*classPoint).getValue();
    return 0;
}

//输出结果
//0
//100
//50

通过Debug查看两种方法的地址,发现相同,说明为相同用法。所以为什么对普通的指针赋值必须要求&value,而函数指针赋值可以&func/func

最后查阅资料,发现原因是普通指针赋值要求&是由于具有二义性,但函数指针并无二义性,因此可以直接赋值或者加&。在普通的变量指针中,若无&代表变量,有&代表变量地址,函数就没有这个问题。

为了保证代码的一致性,使用&func方式更佳。

(真坑 ̄へ ̄


海纳百川 有容乃大