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

We use cookies. Read the Privacy and Cookie Policy

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

    class Name

    {

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

        protected :

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

            Name( Name& ){ } ;

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

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

    }

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

    void fn( Name& n )

    {

        Name newN ;

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

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

    }

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

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

[Советы]

______________

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

_________________

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