Конструктор копирования. Причины использования

Для понимания этой темы нужно знать:

Здесь приводится пример, демонстрирующий необходимость применения конструктора копирования.

Если вы плохо знакомы с указателями, то выполнение этого кода может произойти слегка не так, как вы ожидали. Несмотря на то, что и в первом и во втором случае я вывожу на экран только данные второго созданного мной объекта, не изменяя его напрямую, данные в нём изменились после изменения данных в первом объекте. Такое поведение работы программы объясняется тем, что срабатывает конструктор копирования по умолчанию. Этот конструктор копирования копирует указатель как указатель и получается, что в двух объектах два указателя, каждый указатель указывает на один и тот же адрес. То есть если изменить данные, расположенные на том адресе, то и первый и второй объект будут получать те изменённые данные. Думаю, суть вы должны уловить. Вот в таких случаях и возникает вопрос безопасного копирования данных из одного объекта в другой. Безопасное копирование в этом случае обозначает, что изменения одного из объектов не должны влиять на другой объект. Для решения этого вопроса как раз и используют конструктор копирования.

В самый конец вы можете дописать вывод данных первого объекта на экран. В коде из листинга #2 был использован приём, благодаря которому каждый объект будет обладать своим уникальным указателем. В первом случае (листинг #1) была проблема в том, что оба указателя указывали на одно и то же место, значит, чтобы решить проблему, нужно было сделать два указателя, которые не были бы зависимы друг от друга и указывали бы на разные адреса. Кроме этого нужно учитывать, что при копировании размеры объектов должны совпадать. Чтобы размеры объектов совпадали, я при выделении памяти взял размер из принимаемого объекта и выделил столько памяти, сколько выделено для принимаемого объекта. Не нужно забывать, что при явном использовании конструктора копирования выполнение копирования наша забота, поэтому копируем необходимые данные своими силами. Я выполнил поэлементное копирование одного массива в другой.
После выполнения таких не хитрых операций легко можно работать с обоими объектами не беспокоясь за то, что изменяя один объект мы навредим внутри другого. Это и есть ответ на вопрос: "Зачем нужен конструктор копирования?". Чтобы делать полноценный и независимый клон.
Я натыкался на примеры с деструкторами, но мне такие примеры давали больше бесполезности, чем пользы. Приводимый мной пример, как я могу надеяться, немного нагляднее, понятнее и, самое главное, хорошо дает понять основные причины использования конструктора копирования. Несмотря на то, что мне не пришлись по душе примере с деструкторами, которые я встречал, те примеры тоже полезны и нужны. Но показывать здесь я их не захотел.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

9 комментариев: Конструктор копирования. Причины использования

Добавить комментарий

Ваш e-mail не будет опубликован.

− 1 = 3

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/v-petin/sayt-na-ajax-pod-kluch-gotovoe-reshenie-dlya-internet-magazina-2/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Когда проходишь IQ тест в интернете... помни что самый главный критерий определения твоего IQ — это отправишь ты СМС или нет...

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок