Ответ
В Qt передача по значению подчиняется правилам C++, но имеет особенности для классов Qt.
Ключевые моменты:
- Простые типы и POD-структуры: Передача по значению безопасна и эффективна.
- Классы-контейнеры Qt (QString, QList, QVector): Используют механизм неявного разделения данных (copy-on-write). При передаче по значению создается «поверхностная» копия, которая начинает владеть данными только при модификации. Это эффективно, но требует осторожности в многопоточном коде.
- Классы, наследующие от QObject: Некопируемы. Их конструктор копирования и оператор присваивания удалены. Передавать их можно только по указателю или ссылке.
Пример с QString (copy-on-write):
void processByValue(QString str) { // Создается «легкая» копия
// Модификация приводит к реальному копированию данных (если они разделялись)
str.append(" (modified)");
qDebug() << "Inside function:" << str;
}
int main() {
QString original = "Initial data";
processByValue(original);
qDebug() << "After call:" << original; // Оригинал не изменится
return 0;
}
Рекомендации:
- Для только чтения используйте передачу по
const-ссылке:void func(const QString& str). Это предотвращает любое копирование. - Для модификации внутри функции передавайте по неконстантной ссылке или указателю.
- Для QObject всегда используйте указатели (
QObject*) или ссылки.