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

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

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

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

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

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

  1. Аноним:

    int main()
    void наверное хотел написать)

    Автор сайта отвечает:
    мой косяк) спасибо.

  2. ku-ku:

    отличная статья, спасибо!
    😈 😆 😕 😀 ❗ 🙁 😛 😐 😥 :mrgreen: 😉 😯 😳 ❗ 🙁

  3. Аноним:

    спасибо за статью 😛

  4. Татьяна:

    Спасибо вам большое за статью, немного хоть понятнее стало 🙂

  5. В конструкторе копирования не инициализируете поле size нового объекта. Должно быть упустили.

    Автор сайта отвечает:
    исправил. спасибо.

  6. Ната:

    Ещё можно оператор присваивания переопределить

  7. maximus:

    Спасибо
    Самое толковое (и не растянутое) описание работы конструктора копирования, и того — зачем он нужен.

  8. Юстеф:

    НИЧЕГО НЕПОНЯТНО! СЛОЖНАААА!

  9. Алексей:

    Отлично написано. спасибо )

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

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

https://www.litres.ru/anders-eransson/effektivnoe-ispolzovanie-potokov-v-operacionnoy-sisteme-android-22998682/?lfrom=15589587
Яндекс.Метрика