На этом шаге рассмотрим модель общего использования данных.
Из соображений эффективности во многих классах Qt избегается копирование данных, вместо этого используется ссылка на эти данные (рис. 1).
Рис.1. Четыре шага использования общих данных
Этот принцип получил название общее использование данных (shared data). В Qt используется модель неявных общих данных. В этой модели вызов конструктора копирования или оператора присваивания не приведет к копированию данных, а только увеличит счетчик ссылок на эти данные на 1.
Соответственно, при удалении элемента счетчик ссылок уменьшится на 1. Если значение счетчика ссылок становится равным 0, то данные уничтожаются.
Копирование данных происходит только при изменениях, соответственно значение счетчика ссылок при этом уменьшается.
На рис. 1 на первом шаге создаются два объекта, и т. к. данные им не были присвоены, то они оба указывают на shared_null (общий ноль).
На втором шаге первому объекту присваиваются данные, счетчик ссылок становится равным единице.
На третьем шаге второму объекту присваивается первый объект, и они теперь оба указывают на одни и те же данные, счетчик ссылок при этом увеличивается на единицу.
На четвертом шаге производится изменение данных первого объекта, что приводит к созданию для него отдельной копии, а счетчик ссылок старых данных уменьшается на один, т. к. на один объект, использующий эти данные, стало меньше.
Если бы мы пятым шагом изменили данные второго объекта, то после создания копии для новых данных счетчик ссылок старых данных уменьшился бы до значения 0, и это привело бы к освобождению памяти и уничтожению старых данных.
Проиллюстрируем изображенную на рис. 1 ситуацию программным кодом:
QString str1; // Ссылается на shared_null QString str2; // Ссылается на shared_null str1 = "Новая строка" // Ссылается на данные, счетчик ссылок = 1 str2 = str1; // str1 и str2 указывают на одни и те же данные // счетчик ссылок = 2 str1 += " добавление"; // Производится копирование данных для str1
Продолжим знакомиться с элементами управления и остановимся на элементах выбора. На следующем шаге рассмотрим класс QListWidget.