Глава 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 обеспечивает удобную нотацию. А нельзя ли совместить ограниченный доступ с удобной нотацией?