404_____________________Часть III. Современное программирование на C++
• Когда выполняется копирование
• Разница между копированием и присваиванием
• Положение в классах
• Блокирование копирования и присваивания
• Маленькие хитрости: реализация копирования через присваивание
• Использование копирования и присваивания в производных классах
Понятие копирования
Эта глава об одном из аспектов внутреннего функционирования программ, написанных на C++ — о копировании. Копирование в программах на C++ происходит, прямо или косвенно, буквально на каждом шагу.
Как видно из предыдущих глав, отправных точек для обсуждения новых понятий может быть много. В данной главе мы начнем с рассмвтрения синтаксиса интересующего нас предмета, а затем попробуем углубиться в его осмысление.
Определение конструктора копий
Конструктор копий используется для создания новых объектов из уже существующих. Это означает, что, так же как для других конструкторов, новый объект еще не существует к моменту его вызова. Однако только конструктору копий объект передается как аргумент по ссылке. Итак, синтаксис конструктора копий прост. Конструктор копий произвольного класса х выглядит так:
Х ( const Х&); // конструктор копий типа Х
Так как конструктор копий — это конструктор, то он должен иметь имя, совпадающее с именем класса (не забывайте, что регистр символов существенен). Назначение конструктора копий — дублирование объекта-аргумента для построения нового объекта. Одно из основных правил: если аргумент не должен изменяться, то его следует передавать как константу. В то же время, если аргумент не описан как константа, то нельзя копировать объекты-константы. Переменный объект можно передать как постоянный аргумент, но не наоборот.
Вторая часть объявления аргумента, х, проста: копируется объект того же самого типа. Аргумент в целом читается как "постоянная ссылка на X". Ссылка существенна по нескольким соображениям, в первую очередь потому, что при передаче адреса объекта не создается копия вызывающего объекта (в отличие от передачи аргумента по значению). Если вам чудится здесь какой-то подвох, то будьте внимательны.