- Ниже является C ++ определены глубокие и мелкие копии
-
Когда уже инициализирована с помощью пользовательского класса объектов типа для инициализации еще один новый построенный объект , когда конструктор копирования вызывается автоматически. То есть, когда объект класса должен быть скопирован, конструктор копирования будет называться. Ниже будет называться конструктором копирования:
(1) передать объект по значению переданного функции тела
(2) объект передается по значению возвращаемого из функции
(3) требуемый объект потребности быть инициализированы другим объектом.Если явно не объявить конструктор копирования, то компилятор автоматически генерирует конструктор копирования по умолчанию, копии делается битный конструктор между объектами в классе. Скопируйте биты, известные как мелкая копию, которая будет описана позже.
Пользовательский конструктор копирования является стилем хорошо программирования, он может предотвратить образование конструктора копии компилятора по умолчанию, чтобы повысить эффективность работы источника.
Shallow против глубокой копииВ некоторых случаях, переменные-члены класса нужно открыть память кучи динамической, если выполнение копирования бит, то есть значение объекта в точности скопирована на другой объект, например, A = B. В это время, если В имеет указатель переменная-член применяет для памяти, переменная член, что А также указывает на ту же память. Это представляет собой проблему: Когда память B освобождается (например: деструктор), что указатель находится в руководстве поля, возникновение ошибки.
Глубокое копирование и неполная копия можно просто понимать следующим образом: если класс имеют ресурсы, когда объекты этого класса, которые происходят во время репликации и перераспределения ресурсов, этот процесс является глубокой копией, наоборот, нет никакого перераспределения ресурсов, неглубокая копия. Ниже приведен пример глубокой копии.
- Резюме: Там перераспределение ресурсов: глубокой копии, нет: мелкая копия (непосредственно не вызывать конструктор по умолчанию на самом деле общие данные памяти, два объекта указывают на эту память данных)
-
- Ниже приводится копия QT в глубине, я думаю, что это что-то понять, практичнее
-
1. неполной копия:
Малая копия, такие как ссылка на тип
Неглубокие исходный объект копирования относится к объекту, с совместно используемой копии объекта, только различных эталонных переменных (другое название). 3. Одним из объектов изменений будет влиять на другой объект. Например, человек по имени Чжан начал три позже переименованный по имени Ли четыре, но все тот же человеку, то ли Джо Смит или Джон Доу искореженного искажаются, и все плохие люди.
2. Глубокое копирование:
Такие, как тип значения для глубокой копии. пункты памяти Изменить данные выделения памяти изменяются.
Значение (значение) объекта, такие как предопределенный тип Int32, Double, и структура ( структура), перечисление ( перечисление) и тому подобное.
3. неявное совместное использование:
Неявное совместное использование также называется обратной записью копии. Когда два объекта одни и те же данные (блок данных разделяется мелкой копии), если данные не изменились, репликация данных не выполняется. Когда необходимо изменить объект, чтобы выполнить глубокую копию данных.
- Пример:
:: on_pushButton_8_clicked в MainWindow пустоте () { QString str1 = "Данные"; QDebug () << "String =" ADDR & str1 << << "" << str1.constData (); QString str2 = str1; // неполной копия указывают на то же блока данных () << "Строка адр =" & str2 << << "" << str2.constData QDebug (); str2 = 'E' [3.]; // глубокая копия, объект str2 указывает на новый, отличается от структуры данных , на которую указывает str1 QDebug () << "Строка адр =" & str2 << << "" << str2.constData (); str2 [0] = 'F'; // не в результате чего в любой форме копирования, так как структура данных заостренные str2 не разделяют QDebug () << "Строка адр =" & str2 << << "" << str2.constData (); str1 = str2;// Str1 указывает на структуру данных , будет освобожден из памяти, str1 str2 объект указывает на структуру данных указал QDebug () << "Строка адр = " << & str1 << "" << str1.constData ();// Структура данных str1 будет освобожден из памяти указывал, str1 str2 острые точки объекта в структуре данных QDebug () << "Строка ADDR =" & str2 << << "" << str2.constData (); }
Измеренные выходные результаты являются следующими (в скобках мой анализ):
Строка адр = 0x28c798, 0x14316660 (str2 адрес указатель, указывающий на фронт с QSharedDataPointer, на самом деле, data1)
Строка адр = 0x28c798, 0x1433f2a0 (str2 указатель адреса, указывают на новый QSharedDataPointer, названный data2)
Строка адр = 0x28c798, 0x1433f2a0 (str2 адресный указатель указывает data2, но изменять его содержимое)
Строка эл = 0x28c79c, 0x1433f2a0 (str1 адрес указатель , указывающий data2, не изменяет его содержание, и отказаться от data1, счетчик ссылок равен нулю , так что она полностью отпущена)
Строка адр = (str2 адресный указатель, точка DATA2, не изменяет его содержимое) 0x28c798, 0x1433f2a0Обратите внимание, что адрес str1 и str1.constData (адрес) не то же самое.
-
C ++ глубокой копии глубокой и мелкой копия копии QT, и неявная доля мелкой копии
рекомендация
отwww.cnblogs.com/mtn007/p/11870355.html
рекомендация
ранжирование