Конструктор со ссылкой на qList, как он работает? - PullRequest
0 голосов
/ 16 февраля 2012

Я создаю модель в qt и наткнулся на этот код:

class StringListModel : public QAbstractListModel
{
     Q_OBJECT

public:
    StringListModel(const QStringList &strings, QObject *parent = 0)
    : QAbstractListModel(parent), stringList(strings) {}

    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData(int section, Qt::Orientation orientation,
                     int role = Qt::DisplayRole) const;

private:
   QStringList stringList;
};

Теперь мне интересно, это работает?Если передать в эту функцию список qstringlist, локализованный в стеке, и он выходит из области видимости, не потеряет ли этот объект свой список строк?

Прочитайте оба: C ++ ссылка в конструкторе и: Конструкторы, принимающие строковые ссылки.Плохая идея?

.. где некоторые люди говорят, что он будет недействительным, но некоторые говорят, что строка (в их примерах) будет скопирована в локальную переменную.Это действительно сбивает с толку.

1 Ответ

2 голосов
/ 16 февраля 2012

Если я понимаю, о чем вы спрашиваете, вы обеспокоены тем, что QStringList &strings передается по ссылке?

Список инициализации вызывает конструктор копирования stringList(const &QStringList). Этот конструктор копирования копирует состояние переданного объекта &QStringList в новый объект и назначает этот объект stringList. Таким образом, даже если оригинал &strings выходит из области видимости или иным образом уничтожается, он не имеет значения, поскольку stringList указывает на другой объект.

В вашей второй ссылке не вызывается конструктор копирования ... объект-член назначается для указания на тот же объект, который был ему передан. Если переданный объект будет уничтожен позже в программе, объект-член все равно будет указывать на этот уничтоженный объект, делая его недействительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...