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

лировать объекты могли только друзья и классы-потомки. Это достигается объявлением функций защищенными или закрытыми.

Третья возможность — блокировать копирование вообще. Такой подход иногда оправдан (блокирование рассматривается в следующем разделе). В табл. 17.2 приведены общие рекомендации относительно реализации конструкторов копий и операций присваивания при определении классов.

h04221.jpg

Описание класса

Необходимость копирования

Объявление и определение

Содержит указатели

Да

Объявлять в секции public

Содержит указатели

Нет

Объявлять в секции private; определять не'надо

Нет указателей

Да

Версия, создается комрилятором по умолчанию

Нет указателей

Нет

Объявлять в секции private, определять не надо


Блокирование копирования и присваивания

Издержки на размещение и воспроизведение простых типов данных невелики. Чем сложнее тип данных, тем больше расходы на копирование объектов этого типа. Сложные типы могут требовать нетривиального управления памятью; они могут выполнять сложные графические преобразования; могут состоять из сложных структур данных, например, связанных списков, бинарных деревьев и мультимножеств; могут отвечать за инициализацию внешних устройств или быть элементами разветвленной иерархии. Как и в большинстве вопросов конкретной реализации, именно вам решать, в каких обстоятельствах целесообразно заблокировать копирование.

Чтобы запретить компилятору автоматическое создание конструктора копий и операции присваивания, надо объявить их в классе, но не определять. При этом объявление должно располагаться в закрытой секции. Для произвольного класса х объявление

class X

{

public:

// открытые члены protected:

// защищенные члены ;