Ограничение доступа к объектам классаДружественность
Иногда требуются исключения из правил доступа, когда некоторой функции или классу требуется разрешить доступ к личной части объекта класса. Тогда в определении класса, к объектам которого разрешается такой доступ, должно быть объявление функции или другого класса как "дружественных". Это согласуется с тем принципом, что сам класс определяет права доступа к своим объектам "со стороны".
Объявление дружественной функции представляет собой прототип функции, объявление переопределяемой операции или имя класса, которым разрешается доступ, с ключевым словом friend впереди. Общая схема объявления такова:
class A
{
int x; // Личная часть класса
...
friend class B; // Функции класса B дружественны A
// (имеют доступ к приватной части A)
friend void C::fun(A&); // Элемент-функция fun класса C имеет
// доступ к приватной части A
friend void xxx(A&,int); // Функция xxx дружественна классу A
friend void C::operator+(А&); // Переопределяемая в классе C операция
}; // <объект C>+<объект A> дружественна
// классу A
class B // Необходим доступ к личной части A
{
public: int fun1(A&);
void fun2(A&);
};
class C
{
public: void fun(A&);
void operator+(A&);
};
К средствам контроля доступа относятся также объявления функций-элементов постоянными (const). В этом случае они не имеют права изменять значение текущего объекта, с которым вызываются. Заголовок такой функции при этом имеет вид
void dat::put() const { ... }