添加到 Joachim 的答案中,在 C++ 中,一些实现细节泄漏到接口中是相当不幸的,但出于性能原因,仍然首选让编译器通过将参数作为值传递来进行复制。因此,解释一下,最好的解决方案是:
void abc::CopyData(QByteArray data)
{
...
data.remove(0, n);
...
ByteArrayData.append(data);
}
您绝对不希望通过值传递此类参数的唯一地方是信号声明 - 信号永远不会修改它们的数据。但是,插槽可以这样做:
class MyClass : public QObject {
Q_OBJECT
...
public:
// pass by const reference in signals
Q_SIGNAL void dataSource(const QByteArray &); // The only correct signal form
// pass by const reference or value in slots, depending on use
Q_SLOT void dataSink1(const QByteArray &); // Valid
Q_SLOT void dataSink2(QByteArray); // Valid as well.
};
无论是 Qt4 还是 Qt5 连接样式,连接到任一插槽都使用相同的代码。因此,您不必担心由于泄漏的实现细节会破坏您的代码而导致的此类接口更改。
// Qt4 - you should elide const and reference anyway
connect(src, SIGNAL(dataSource(QByteArray)), dst, SLOT(dataSink1(QByteArray));
connect(src, SIGNAL(dataSource(QByteArray)), dst, SLOT(dataSink2(QByteArray));
// Qt5
connect(src, &MyClass::dataSource, dst, &MyClass::dataSink1);
connect(src, &MyClass::dataSource, dst, &MyClass::dataSink2);