470 Часть III. Современное программирование на C++

ренно пропустили конструктор копий. Вообще говоря, комментарии относительно названных четырех членов уместны в каждом классе. Вот пример:

class X

{

public:

Х (); // конструктор по умолчанию

virtual ~X (); // виртуальный деструктор

// Конструктор копии и операция присваивания не определены

// намеренно. Класс содержит только данные, размещаемые

//в стеке, поэтому предопределенных конструктора копий

//и операции присваивания достаточно.

private:

int data;

char moreData;

float no Pointers;

}

*

Если хотя бы одно из названных условий не выполняется, то следует определить как конструктор копий, так и операцию присваивания.

Операция присваивания

В предыдущем разделы мы пришли к заключению, что не стоит определять операцию присваивания без конструктора копий и наоборот. Следовательно, напрашивается вывод, что основные рекомендации для операции присваивания справедливы также и для конструктора копий.

Если класс содержит указатели или ссылки, то скорее всего вам придется определять операцию присваивания для этого класса самостоятельно, не полагаясь на компилятор. В противном случае можно спокойно использовать созданные компилятором присваивание и копирование, при этом полезно упомянуть об этом в комментариях к классу. Хотя краткость и сестра таланта, но излишняя лаконичность в разработке программного обеспечения неуместна. Это особенно актуально, если ваша программа предназначена для планирования или управления оборудованием, транспортом, рентгеновскими излучателями или чем-либо другим, связанным с риском для жизни. Последовательность и добросовестность во всяком случае никогда не повредят.

Буквальное копирование и развернутое копирование

В этом разделе под словом "копирование" понимается дублирование объектов, как посредством операции присваивания, так и с помощью конструктора копий. Есть два вида копирования: буквальное копирование (shallow