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 (ia++;
}
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 на две части - защищенный интерфейс и общий
интерфейс:
Бьерн Страуструп.
Язык программирования С++
172
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 общий член
}
Бьерн Страуструп.
Язык программирования С++
173
Достарыңызбен бөлісу: |