Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
В языке программирования C++ конструктор копирования – это специальный конструктор для создания нового объекта как копии существующего. Конструкторы копирования являются стандартным способом копирования объектов в C++, в отличие от клонирования, и обладают специфическими особенностями C++. Первый аргумент такого конструктора – это ссылка на объект того же типа, что и создаваемый (const или non-const), за которым могут следовать параметры любого типа (все имеющие значения по умолчанию). Обычно компилятор автоматически генерирует конструктор копирования для каждого класса (известный как неявный конструктор копирования), но в особых случаях программист создает конструктор копирования, известный как пользовательский конструктор копирования. В таких случаях компилятор не генерирует его. Таким образом, всегда существует ровно один конструктор копирования, который определен либо пользователем, либо системой. Пользовательский конструктор копирования обычно необходим, когда объект владеет указателями или несовмещаемыми ссылками, например, на файл, в этом случае также следует определить деструктор и оператор присваивания (см. Правило трех).
In the C++ programming language, a copy constructor is a special constructor for creating a new object as a copy of an existing object. Copy constructors are the standard way of copying objects in C++, as opposed to cloning, and have C++ specific nuances. The first argument of such a constructor is a reference to an object of the same type as is being constructed (const or non const), which might be followed by parameters of any type (all having default values). Normally the compiler automatically creates a copy constructor for each class (known as an implicit copy constructor) but for special cases the programmer creates the copy constructor, known as a user defined copy constructor. In such cases, the compiler does not create one. Hence, there is always one copy constructor that is either defined by the user or by the system. A user defined copy constructor is generally needed when an object owns pointers or non shareable references, such as to a file, in which case a destructor and an assignment operator should also be written (see Rule of three).
Примеры
Эти примеры иллюстрируют, как работают копирующие конструкторы и почему они иногда требуются.
These examples illustrate how copy constructors work and why they are sometimes required.
Конструктор копирования по битам
В C++ нет такого понятия, как "побитный копирующий конструктор". Однако, конструктор копирования, сгенерированный по умолчанию, копирует члены, вызывая их копирующие конструкторы, и для члена, являющегося необработанным указателем, это приведет к копированию самого указателя (то есть не глубокое копирование).
There is no such thing as "bitwise copy constructor" in C++. However, the default generated copy constructor copies by invoking copy constructors on members, and for a raw pointer member this will copy the raw pointer (i. e. not a deep copy).
Логический конструктор копий
Логический конструктор копирования создает полноценную копию структуры, включая все её динамически выделенные участки. Логические конструкторы копирования особенно важны, когда объект, который копируется, содержит указатели или сложные объекты.
A logical copy constructor makes a true copy of the structure as well as its dynamic structures. Logical copy constructors come into the picture mainly when there are pointers or complex objects within the object being copied.