Конструктор копирования — это конструктор с одним параметром ссылочного характера, где этот один параметр имеет тип тот же класс, внутри которого конструктор находится
Возможно, сложно сказано, но пример всё разрулит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Листинг #1 Конструктор копирования
classMyClass{
intvalue;
public:
MyClass(MyClass& x){ //конструктор копирования
}
MyClass(){} //конструктор по умолчанию
};
intmain(){
MyClass obj1;//так сработает конструктор по умолчанию
Когда мы добавляем в класс любого вида конструктор, то если этот добавляемый конструктор не конструктор по умолчанию, то надо будет обязательно добавить и конструктор по умолчанию, иначе при попытке компиляции возникнет ошибка.
После того, как вы определите хотя бы один конструктор класса, компилятор перестанет создавать конструктор по умолчанию.
Поэтому в листинге #1 присутствует и конструктор копирования и конструктор по умолчанию.
Любой объект класса должен быть обучен ходу своего построения. В случае с конструктором копирования объект должен быть обучен ходу копирования.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//Листинг #2 Конструктор копирования
#include <iostream>
#include <string.h>
classMyClass{
charvalue[256];
public:
MyClass(MyClass& x){ //конструктор копирования
// value = x;//так нельзя
unsignedsize_=strlen(x.get());//узнаём длину входящей строки
Любая строка — это прежде всего массив символов, никто не запрещает посимвольный обход строки для вытаскивания из неё символов. Это это и есть. Точнее, сам обход выполняется благодаря циклу, эта часть сначала определяет позицию строки value для записи туда значения, потом вытаскивает символ из вошедшей в конструктор строки согласно индексу i. Поскольку типом параметра x является MyClass&, то x является объектом класса. У объекта x описан метод для получения значения, метод get(), обращение к этому методу возвращает нам указательную переменную, указывающую на строку, хранимую внутри x. Фактически мы получаем эквивалент строки: x.get(). Поскольку это эквивалент строки, а строка по сути своей массив символов, мы можем обратиться по индексу как к массиву, что я и сделал: x.get()[i]. Вытащенный символ из строки присваивается в выбранную позицию. Вот и всё.
Нельзя массиву присваивать ничего, поэтому отмеченое value = x не сработает: не скомпилируется. Но это не классический пример. Классический пример даётся на указателе, где выделяется память. Основное преимущество конструктора копирования — возможность глубинного копирования, т. е. любой сложный объект с помощью конструктора копирования может быть скопирован полностью, а не частично. Частично объект мог бы быть скопирован, если бы копировался указатель, когда нужен бы был массив, если бы копирование производилось обычным присваиванием или с помощью скобок при объявлении объекта.
При обходе основной строки, из которой копируем значения, нужно было захватить символ-признак конца строки, поэтому в цикле была прибавлена единица, если кто-то не понял, зачем она там нужна.
Важно помнить, что для конструктора копирования нужен один параметр ссылочного характера, тип которого класс, внутри которого конструктор находится. И понимать, что компилятор штука умная, но конструкторам нужно подсказывать. Конструктору копирования надо показывать процесс копирования. После того как конструктор копирования объявлен, задействовать его можно с помощью операции присвоения, круглых скобок или фигурных скобок, где скармливаемый объекту объект будет иметь тот же тип, что и у поедающего объекта объект. Т. е. если у обоих объектов тип один и тот же и представляет наш собственный класс, внутри которого описан конструктор копирования, то такие объекты можно легко кормить друг другу с целью копировать объект в объект.
Вообще, конструктор копирования очень удобен для присваивания объектов, типы которых сложные структуры (стеки, очереди и др.).
Конструктор копирования ничего не копирует сам, процесс копирования в конструкторе описывает программист своими руками.
Рассмотрен материал очень поверхностно в очень сокращённом изложении. Но буду надеяться, что кому-то эта манера понравится и этот кто-то суть конструктора копирования сумеет понять просто из этой темы.
2 комментария на «“Конструктор копирования. Поверхностное знакомство”»
Спасибо)
😉 😉 😉 😉 😉