Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет128/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   124   125   126   127   128   129   130   131   ...   256
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 


Достарыңызбен бөлісу:
1   ...   124   125   126   127   128   129   130   131   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет