Как в Qt передавать объекты по значению?

«Как в Qt передавать объекты по значению?» — вопрос из категории Qt, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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;
}

Рекомендации:

  1. Для только чтения используйте передачу по const-ссылке: void func(const QString& str). Это предотвращает любое копирование.
  2. Для модификации внутри функции передавайте по неконстантной ссылке или указателю.
  3. Для QObject всегда используйте указатели (QObject*) или ссылки.