Конструктор копирования. Поверхностное знакомство

Этой статьёй очень поверхностно описывается конструктор копирования.
  • Конструктор копирования — это конструктор с одним параметром ссылочного характера, где этот один параметр имеет тип тот же класс, внутри которого конструктор находится
Возможно, сложно сказано, но пример всё разрулит:

Когда мы добавляем в класс любого вида конструктор, то если этот добавляемый конструктор не конструктор по умолчанию, то надо будет обязательно добавить и конструктор по умолчанию, иначе при попытке компиляции возникнет ошибка.

  • После того, как вы определите хотя бы один конструктор класса, компилятор перестанет создавать конструктор по умолчанию.

Поэтому в листинге #1 присутствует и конструктор копирования и конструктор по умолчанию.

Любой объект класса должен быть обучен ходу своего построения. В случае с конструктором копирования объект должен быть обучен ходу копирования.

Возможно, вам будет сложно понять

Любая строка — это прежде всего массив символов, никто не запрещает посимвольный обход строки для вытаскивания из неё символов. Это это и есть. Точнее, сам обход выполняется благодаря циклу, эта часть сначала определяет позицию строки value для записи туда значения, потом вытаскивает символ из вошедшей в конструктор строки согласно индексу i. Поскольку типом параметра x является MyClass&, то x является объектом класса. У объекта x описан метод для получения значения, метод get(), обращение к этому методу возвращает нам указательную переменную, указывающую на строку, хранимую внутри x. Фактически мы получаем эквивалент строки: x.get(). Поскольку это эквивалент строки, а строка по сути своей массив символов, мы можем обратиться по индексу как к массиву, что я и сделал: x.get()[i]. Вытащенный символ из строки присваивается в выбранную позицию. Вот и всё.
Нельзя массиву присваивать ничего, поэтому отмеченое value = x не сработает: не скомпилируется. Но это не классический пример. Классический пример даётся на указателе, где выделяется память. Основное преимущество конструктора копирования — возможность глубинного копирования, т. е. любой сложный объект с помощью конструктора копирования может быть скопирован полностью, а не частично. Частично объект мог бы быть скопирован, если бы копировался указатель, когда нужен бы был массив, если бы копирование производилось обычным присваиванием или с помощью скобок при объявлении объекта.
При обходе основной строки, из которой копируем значения, нужно было захватить символ-признак конца строки, поэтому в цикле была прибавлена единица, если кто-то не понял, зачем она там нужна.
Важно помнить, что для конструктора копирования нужен один параметр ссылочного характера, тип которого класс, внутри которого конструктор находится. И понимать, что компилятор штука умная, но конструкторам нужно подсказывать. Конструктору копирования надо показывать процесс копирования. После того как конструктор копирования объявлен, задействовать его можно с помощью операции присвоения, круглых скобок или фигурных скобок, где скармливаемый объекту объект будет иметь тот же тип, что и у поедающего объекта объект. Т. е. если у обоих объектов тип один и тот же и представляет наш собственный класс, внутри которого описан конструктор копирования, то такие объекты можно легко кормить друг другу с целью копировать объект в объект.
Вообще, конструктор копирования очень удобен для присваивания объектов, типы которых сложные структуры (стеки, очереди и др.).
  • Конструктор копирования ничего не копирует сам, процесс копирования в конструкторе описывает программист своими руками.
Рассмотрен материал очень поверхностно в очень сокращённом изложении. Но буду надеяться, что кому-то эта манера понравится и этот кто-то суть конструктора копирования сумеет понять просто из этой темы.

2 комментария на «“Конструктор копирования. Поверхностное знакомство”»

  1. Аноним:

    😉 😉 😉 😉 😉

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

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

Поиск

 
     

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

https://www.litres.ru/aleksandr-shen/programmirovanie-teoremy-i-zadachi-11647808/?lfrom=15589587
Яндекс.Метрика