c++ - 这些参数有什么区别

标签 c++ qt

我是 C++ 新手,正在学习 Qt。

考虑这一行:

connect(ui->horizontalSlider, &QSlider::valueChanged,
        ui->progressBar, &QProgressBar::setValue);

我不明白的是为什么你传递的是一个静态(是静态的吗?)方法valueChanged(&QSlider::valueChanged)的地址,而不是当前对象的方法地址&ui ->horizo​​ntalSlider->valueChanged。尽管我可以使用同样有效的第二个选项。

最佳答案

您传递应调用的成员函数的地址。 成员函数不是静态的,这意味着它需要一个对象才能工作。

class MyClass
{
    void aFunction();
}

这里 MyClass::aFunction 是一个成员函数。

编译器创建的和这个类似

class MyClass
{
    static void aFunction(MyClass *this);
}

所以每当你像my_instance.aFunction()那样调用aFunction时,this指针就会被隐式传递,所以调用基本上变成了MyClass::aFunction(&my_instance)。 因此,aFunction 的地址对于 MyClass 的每个实例都是相同的。 然而,要执行 aFunction,您需要 MyClass 的实例。

这就是为什么在你的情况下你必须提供 connect 实例 ui->horizo​​ntalSlider 以及要在其上调用的函数 &QSlider: :valueChanged.

我所描述的过于简单化,因此请对它持保留态度。 此外,当您拥有虚函数时,情况就会发生变化。

关于c++ - 这些参数有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28515298/

相关文章:

c++ - cout << a++ << a;的正确答案是什么?

c++ - 为什么动态和静态数组具有不同的类型名称? (C++)

c++ - 在另一个 vector 中搜索一个 vector

c++ - 如何为 QTableView 中的特定单元格着色或加粗文本?

qt - 通过 eventFilter 连接/断开信号

c++ - QGridLayout 具有不同大小的单元格

c++ - CRTP 没有编译时检查吗?

c++ - 比较两个map::iterators:为什么需要std::pair的拷贝构造函数?

使用 Qt 进行 C++0x 编程

qt - 替换 Qt 5.7 中的 QGraphicsWebView