422 Часть III. Современное программирование на C++
лировать объекты могли только друзья и классы-потомки. Это достигается объявлением функций защищенными или закрытыми.
Третья возможность — блокировать копирование вообще. Такой подход иногда оправдан (блокирование рассматривается в следующем разделе). В табл. 17.2 приведены общие рекомендации относительно реализации конструкторов копий и операций присваивания при определении классов.
Описание класса |
Необходимость копирования |
Объявление и определение |
Содержит указатели |
Да |
Объявлять в секции public |
Содержит указатели |
Нет |
Объявлять в секции private; определять не'надо |
Нет указателей |
Да |
Версия, создается комрилятором по умолчанию |
Нет указателей |
Нет |
Объявлять в секции private, определять не надо |
Блокирование копирования и присваивания
Издержки на размещение и воспроизведение простых типов данных невелики. Чем сложнее тип данных, тем больше расходы на копирование объектов этого типа. Сложные типы могут требовать нетривиального управления памятью; они могут выполнять сложные графические преобразования; могут состоять из сложных структур данных, например, связанных списков, бинарных деревьев и мультимножеств; могут отвечать за инициализацию внешних устройств или быть элементами разветвленной иерархии. Как и в большинстве вопросов конкретной реализации, именно вам решать, в каких обстоятельствах целесообразно заблокировать копирование.
Чтобы запретить компилятору автоматическое создание конструктора копий и операции присваивания, надо объявить их в классе, но не определять. При этом объявление должно располагаться в закрытой секции. Для произвольного класса х объявление
class X
{
public:
// открытые члены protected:
// защищенные члены ;