24

用于以下类型的信号和插槽

signals:
    void textChanged(const QString &);

public slots:
    void setText(const QString & text)

textChanged 和 setText 的参数类型似乎对const&起作用。与仅使用 QString 相比,常量和引用限定有什么不同吗?

QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString)));
QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &)));

编辑:当在 SIGNAL 或 SLOT 中使用不兼容的类型时,我没有注意到输出窗口显示错误消息。我认为信号槽机制能够在编译时检测参数类型错误。

4

2 回答 2

28

Qt 检查一个规范化的签名,意思是

规范化将空白减少到最低限度,在适当的情况下将“const”移到前面,从值类型中删除“const”并用值替换 const 引用。

于 2009-12-20T10:17:26.000 回答
4

免责声明:我的 qt 相当生疏,但信号/槽机制仍然只是 C++ 函数调用。如果信号/插槽机制实际上将对象复制到内部存储中,我很抱歉(您需要检查 Qt 页面,信号/插槽 afaik 上有一个很大的页面) - 因为下面的位仅在 C++ 上下文中相关,不在 C++ + Qt 上下文中。

如果您省略引用,则字符串将被复制(并且拥有 const 并不重要,对其所做的任何更改都将保留在函数中)。
如果您保留引用但取出 const,则您允许该方法修改您给它的字符串。它们都有效,但对您传递的对象做不同的事情(复制量/保留更改的可能性)。

我建议您阅读以下资源:

(关于 const 正确性)https://isocpp.org/wiki/faq/const-correctness

(关于参考)https://isocpp.org/wiki/faq/references

准确理解什么是传递参数以及 void foo(const A&)/// 有何 不同void foo(const A)void foo(A&)void foo(A)

于 2009-12-20T07:53:01.823 回答