470 Часть III. Современное программирование на C++
ренно пропустили конструктор копий. Вообще говоря, комментарии относительно названных четырех членов уместны в каждом классе. Вот пример:
class X
{
public:
Х (); // конструктор по умолчанию
virtual ~X (); // виртуальный деструктор
// Конструктор копии и операция присваивания не определены
// намеренно. Класс содержит только данные, размещаемые
//в стеке, поэтому предопределенных конструктора копий
//и операции присваивания достаточно.
private:
int data;
char moreData;
float no Pointers;
}
*
Если хотя бы одно из названных условий не выполняется, то следует определить как конструктор копий, так и операцию присваивания.
Операция присваивания
В предыдущем разделы мы пришли к заключению, что не стоит определять операцию присваивания без конструктора копий и наоборот. Следовательно, напрашивается вывод, что основные рекомендации для операции присваивания справедливы также и для конструктора копий.
Если класс содержит указатели или ссылки, то скорее всего вам придется определять операцию присваивания для этого класса самостоятельно, не полагаясь на компилятор. В противном случае можно спокойно использовать созданные компилятором присваивание и копирование, при этом полезно упомянуть об этом в комментариях к классу. Хотя краткость и сестра таланта, но излишняя лаконичность в разработке программного обеспечения неуместна. Это особенно актуально, если ваша программа предназначена для планирования или управления оборудованием, транспортом, рентгеновскими излучателями или чем-либо другим, связанным с риском для жизни. Последовательность и добросовестность во всяком случае никогда не повредят.
Буквальное копирование и развернутое копирование
В этом разделе под словом "копирование" понимается дублирование объектов, как посредством операции присваивания, так и с помощью конструктора копий. Есть два вида копирования: буквальное копирование (shallow