Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lectures_2.doc
Скачиваний:
28
Добавлен:
15.03.2015
Размер:
511.49 Кб
Скачать

Дружественные функции и дружественные классы

Одним из основных принципов объектно-ориентированного программирования является инкапсуляция (сокрытие информации).

Однако в ряде случаев селективное (выборочное) предоставление прав доступа отдельным функциям или даже классам может быть полезным. Для этих целей и используется аппарат дружественных функций и классов.

Дружественное отношение устанавливается с помощью зарезервированного слова friend.

Типичные ситуациями, когда используются дружественные ситуации:

  • Функция должна получить привилегированный доступ к закрытой части более чем одного класса.

  • Перегрузка операторов.

Дружественной функцией по отношению к некоторому классу может быть объявлена как внешняя функция, так и функция-член другого класса. В последнем случае необходимо использовать оператор уточнения области действия «::.»

Пример.

class One { public: friend void f1(One& one);// friend функция int f2(Two& two); // Функция-член класса One // ... }; class Two { public: friend int One :: f2(Two& two);// friend функция // ... }; class Three { public: friend class One;// friend класс };

Обсуждение.

  1. В классе Oneобъявлена внешняя дружественная функцияf1()/

  2. В классе Twoобъявлена дружественной функция-членf2() классаOne

  3. В классе Threeдружественным объявлен классOne. Это означает, все функции классаOneполучают статус дружественности по отношению к классуThree.

Особенности применения дружественных функций и классов

Отметим ряд особенностей, которые следует учитывать при работе с дружественными функциями.

Дружественные функции не передается неявный указатель this. Поэтому при вызове дружественной функции нельзя использовать операторы:

.

->

Это обусловлено тем фактом, что дружественная функция не является компонентом класса.

Что же дает отношение дружественности ? Ответ состоит в следующем.

Пусть имеется некоторая функция f(), которая объявлена дружественной в классеSomeClass. Это означает, что функцияf() получает доступ к закрытым компонентам всех объектов классаSomeClass. Такие объекты могут передаваться в функциюf() через ее параметры или объявляться в теле рассматриваемой функции.

Место расположения прототипа функции, объявляемой в качестве дружественной в теле не имеет значения.

Примеры использования дружественных функций

// Файл One.h class One { private: int n; int m; friend void f(One& one); // ... }; // Клиентский код. voidg() {Oneone1,one2;one1.f(one2); // недопустимо использовать оператор «.» // ... }void f(One& one) { one.n = 0; // Нормально m = 10; // Ошибка One one1; one1.n = 20; // Нормально }

Дружественность не обладает свойством взаимности.

class One { friend class Two; // ... };

Класс Twoявляется «другом» классаOne, но классOneне становится «другом» классаTwo.

Отношение дружественности не обладает свойством транзитивности. Друзья друзей класса Oneне являются друзьями классаOne.

Пример.

class One { private: int n; friend class Two; // ... }; class Two { friend class Three; // ... }; class Three { void f(One& one) { one.n = 20; // Ошибка } };

Соседние файлы в предмете Программирование