Глава 14. Базовые концепции классов____________________________347
(наподобие того, как среднестатистического автолюбителя, как правило, мало трогают детали, из которых построен карбюратор).
В то время, как спецификатор public образует открытый интерфейс, члены, объявленные после ключевого слова private, составляют реализацию. Реализация, как и карбюратор, необходима, но для управления автомобилем ее детали не обязательно должны быть понятны.
Когда вы располагаете данные и функции в закрытой области доступа, вы даете понять среднему пользователю, что ему не надо принимать во внимание содержащиеся внутри нее детали — они не влияют на назначение или использование этого класса.
friend. Спецификатор friend был введен для удобства записи и отчасти для скорости; его назначение состоит в том, чтобы дать возможность другим классам и функциям вторгаться в закрытую область доступа. Ключевое слово friend (друг) в объявлении функции или .класса указывает, что данная функция или класс имеет доступ в закрытую секцию. Использование этого спецификатора демонстрирует следующий пример: .
Class FRIENDJ3YNTAX
f
friend return type FunctionName(); // функция-друг
friend class CLASS NAME II класс-друг
public:
private:
// Друзья этого класса объявлены в классе //и имеют доступ к членам этой секции };
Объявление друзей должно располагаться между фигурными скобками внутри определения класса. В знак признания их особого положения мы здесь будем располагать их в начале — но, впрочем, это всего только соглашение.
Друзья класса имеют доступ к закрытым членам класса и, следовательно, имеют возможность нарушить целостность класса, поэтому в применении спецификатора friend следует проявлять разумную осторожность. Расширению "дружелюбия" класса есть альтернативы, их вы найдете в главе 16 "Перегрузка операций".
Альтернативы использованию друзей. Друзьям класса существует альтернатива; давайте бегло коснемся ее, не вдаваясь в излишние подробности (детально мы рассмотрим ее в главе 16).
Вспомните, зачем нужен спецификатор friend: для доступа к закрытым членам класса. Однако часто он используется для доступа не ко всем закрытым членам, а конкретно к данным. Теперь вспомните, что делают функции доступа: они обеспечивают доступ именно к данным-членам.
Эти функции предоставляют ограниченный доступ, а спецификатор friend обеспечивает удобную нотацию. А нельзя ли совместить ограниченный доступ с удобной нотацией?