►Защита от копирования...276

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

    class Name

    {

        /* ...всё, как и раньше... */

        protected :

            /* Конструктор копирования */

            Name( Name& ){ } ;

            /* Оператор присвоения */

            Name& operator=( Name& s ) { return *this ; }

    }

Присвоения наподобие приведённого далее ( при таком определении ) будут запрещены[ 18 ].

    void fn( Name& n )

    {

        Name newN ;

        newN = n ; /* Ошибка  компиляции — функция не */

                  /* имеет права доступа к operator=( ) */

    }

Такая защита от копирования спасает вас от перегрузки оператора присвоения, но при этом снижает гибкость вашего класса.

«Если ваш класс использует какие-либо ресурсы, например, память из кучи, вы обязаны либо разработать удовлетворительные оператор присвоения и конструктор копирования, либо сделать их защищёнными для предотвращения их использования.»

[Советы]

______________

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

_________________

276 стр. Часть 5. Полезные особенности