Реферат: Объективное программирование
// выхода из main()
}
3.3 Ограничение доступа к объектам класса. Дружественность.
----------------------------------------------------------
Выше было дано формальное определение класса. Содержательная его сторона состоит в том, что класс выступает в Си++ как определенный программистом тип данных. Такой тип данных включает в себя:
- описание структуры объектов класса. Объект класса представляет собой совокупность элементов (структуру), каждый из которых является переменной некоторого типа или объектом ранее определенного класса;
- описание множества допустимых операций над объектом класса, которые представлены элементами-функциями;
- описание процедур создания и уничтожения объекта класса (конструктор и деструктор).
При этом внутренняя структура объектов (описанная в "приватной" части класса) доступна только элементам-функциям. Наоборот, "публичная" часть определения класса - это описание той части объекта, к которой возможен доступ из любого места программы, если доступен сам объект. Данное ограничение позволяет исключить некорректное использование объектов класса, как случайное, так и умышленное. Возможные ошибки, связанные с неправильным "поведением" объектов класса, локализуются таким образом в определении самого класса, а не в использовании его объектов.
Иногда требуются исключения из этого правила, когда к "приватной" части объекта класса требуется доступ из некоторой отдельной функции, либо из всех элементов-функций другого класса, либо из переопределяемой в другом классе операции. Тогда в определении класса, к объектам которого разрешается такой доступ, должно быть объявление функции или другого класса "дружественным". Это согласуется с тем принципом, что сам класс определяет права доступа к своим объектам "со стороны".
Объявление дружественной функции предствляет собой прототип функции, объявление переопределяемой операции или имя класса, которым разрешается доступ, с ключевым словом 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
{
public: int fun1(A&);// Необходим доступ к приватной части A