C ++ глубокой копии глубокой и мелкой копия копии QT, и неявная доля мелкой копии

  • Ниже является 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 (адрес) не то же самое.

рекомендация

отwww.cnblogs.com/mtn007/p/11870355.html