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

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

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

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

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

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

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

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

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

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

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

− 6 = 2

Поиск

 
     

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

https://www.litres.ru/robert-s-martin/idealnyy-programmist-kak-stat-professionalom-razrabotki-po/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Солидной компании на постоянную работу требуется девушка приятной внешности со знанием Linux, программирование встраиваемых микроконтроллеров на C/C++/ASM, знание Linux - установка и настройка (сеть, графика, установка драйверов); C , Python, технологии ООП, GTK (желательно PyGTK) или Qt, SQL и XML - базовые знания; понимание многопоточности и синхронизации потоков.

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

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