Глава 17. Конструкторы: копирование и присваивание__________________423

private: •

// закрытые члены

// блокировка копирования

Х( const X&);

Х& operator=(const X&);

};

без определения (тело функции отсутствует) блокирует копирование, заставляя компилятор генерировать сообщение об ошибке при вызове одной из этих функций. Этот прием запрещает копирование отдельных объектов, не лишая, однако, вас возможности использовать псевдонимы (псевдонимом, если вы забыли, может быть, например, имя аргумента, через который передается ссылка на объект).

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

Реализация копирования через присваивание

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

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

Часто встречается такой вариант реализации:

class X {

public: ' // .. конструктор, деструктор и другие члены класса

// конструктор копий, реализованный через (то есть // неявно вызывающий) операцию присваивания Х ( const Xs rhs) { *this = rhs; }