Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КРАТКИЙ ОБЗОР С.doc
Скачиваний:
1
Добавлен:
26.10.2018
Размер:
2.11 Mб
Скачать

6.6 Контроль доступа

      Член класса может быть частным (private), защищенным (protected)       или общим (public):       Частный член класса X могут использовать только функции-члены и       друзья класса X.       Защищенный член класса X могут использовать только функции-члены       и друзья класса X, а так же функции-члены и друзья всех       производных от X классов (см. $$5.4.1).       Общий член можно использовать в любой функции.       Эти правила соответствуют делению обращающихся к классу функций на три       вида: функции, реализующие класс (его друзья и члены), функции,       реализующие производный класс (друзья и члены производного класса) и       все остальные функции.       Контроль доступа применяется единообразно ко всем именам. На       контроль доступа не влияет, какую именно сущность обозначает имя.       Это означает, что частными могут быть функции-члены, константы и т.д.       наравне с частными членами, представляющими данные:       class X {       private:       enum { A, B };       void f(int);       int a;       };       void X::f(int i)       {       if (i<A) f(i+B);       a++;       }       void g(X& x)       {       int i = X::A; // ошибка: X::A частный член       x.f(2); // ошибка: X::f частный член       x.a++; // ошибка: X::a частный член       }

6.6.1 Защищенные члены

      Дадим пример защищенных членов, вернувшись к классу window из       предыдущего раздела. Здесь функции _draw() предназначались только для       использования в производных классах, поскольку предоставляли неполный       набор возможностей, а поэтому не были достаточны удобны и       надежны для общего применения. Они были как бы строительным       материалом для более развитых функций. С другой стороны, функции draw()       предназначались для общего применения. Это различие можно выразить,       разбив интерфейсы классов window на две части - защищенный интерфейс       и общий интерфейс:       class window {       public:       virtual void draw();       // ...       protected:       void _draw();       // другие функции, служащие строительным материалом       private:       // представление класса       };       Такое разбиение можно проводить и в производных классах, таких, как       window_w_border или window_w_menu.       Префикс _ используется в именах защищенных функций, являющихся       частью реализации класса, по общему правилу: имена, начинающиеся с _ ,       не должны присутствовать в частях программы, открытых для общего       использования. Имен, начинающихся с двойного символа подчеркивания,       лучше вообще избегать (даже для членов).       Вот менее практичный, но более подробный пример:       class X {       // по умолчанию частная часть класса       int priv;       protected:       int prot;       public:       int publ;       void m();       };       Для члена X::m доступ к членам класса неограничен:       void X::m()       {       priv = 1; // нормально       prot = 2; // нормально       publ = 3; // нормально       }       Член производного класса имеет доступ только к общим и защищенным       членам:       class Y : public X {       void mderived();       };       Y::mderived()       {       priv = 1; // ошибка: priv частный член       prot = 2; // нормально: prot защищенный член, а       // mderived() член производного класса Y       publ = 3; // нормально: publ общий член       }       В глобальной функции доступны только общие члены:       void f(Y* p)       {       p->priv = 1; // ошибка: priv частный член       p->prot = 2; // ошибка: prot защищенный член, а f()       // не друг или член классов X и Y       p->publ = 3; // нормально: publ общий член       }