Введение

В языке программирования C++ конструктор копирования – это специальный конструктор для создания нового объекта как копии существующего. Конструкторы копирования являются стандартным способом копирования объектов в C++, в отличие от клонирования, и обладают специфическими особенностями C++. Первый аргумент такого конструктора – это ссылка на объект того же типа, что и создаваемый (const или non-const), за которым могут следовать параметры любого типа (все имеющие значения по умолчанию). Обычно компилятор автоматически генерирует конструктор копирования для каждого класса (известный как неявный конструктор копирования), но в особых случаях программист создает конструктор копирования, известный как пользовательский конструктор копирования. В таких случаях компилятор не генерирует его. Таким образом, всегда существует ровно один конструктор копирования, который определен либо пользователем, либо системой. Пользовательский конструктор копирования обычно необходим, когда объект владеет указателями или несовмещаемыми ссылками, например, на файл, в этом случае также следует определить деструктор и оператор присваивания (см. Правило трех).

Примеры

Эти примеры иллюстрируют, как работают копирующие конструкторы и почему они иногда требуются.

Конструктор копирования по битам

В C++ нет такого понятия, как "побитный копирующий конструктор". Однако, конструктор копирования, сгенерированный по умолчанию, копирует члены, вызывая их копирующие конструкторы, и для члена, являющегося необработанным указателем, это приведет к копированию самого указателя (то есть не глубокое копирование).

Логический конструктор копий

Логический конструктор копирования создает полноценную копию структуры, включая все её динамически выделенные участки. Логические конструкторы копирования особенно важны, когда объект, который копируется, содержит указатели или сложные объекты.