■■■
Я так и слышу, как поклонники функционального подхода говорят: "Не нужно делать ничего противоестественного! Достаточно потребовать от программиста, чтобы он попросту не трогал некоторые члены класса".
Всё это верно в теории, однако не оправдывается на практике. Программисты начинают писать программы, будучи переполненными благих намерений, однако приближение сроков сдачи программы заставляет их всё больше разочаровываться в отсутствии возможности прямого доступа к защищённым членам класса.
Как устроены защищённые члены...182
Добавление в класс ключевого слова public делает все находящиеся за ним члены класса открытыми, а значит, доступными для функций — не членов класса. Использовав ключевое слово protected , вы делаете все последующие члены класса защищёнными, т.е. недоступными для функций, которые не являются членами класса. Переключаться между защищёнными и открытыми членами класса можно сколько угодно раз.
Допустим, у нас есть класс Student . В приведённом ниже примере представлены все необходимые возможности, которые нужны классу, описывающему студента ( за исключением разве что функций spendMoney ( тратить деньги ) и drinkBeer ( пить пиво ), которые тоже являются свойствами студента ):
addCourse ( int hours , float grade ) — добавить пройденный курс;
grade ( ) — вернуть текущую среднюю оценку;
hours ( ) — вернуть количество прослушанных часов.
Оставшиеся члены класса Student можно объявить как защищённые, чтобы другие функции не могли "лезть" во внутренние дела класса Student .
class Student
{
public :
/* grade — возвращает текущую среднюю оценку */
float grade( )
{
return gpa ;
}
/* hours — возвращает количество прослушанных часов */
int hours( )
{
return semesterHours ;
}
/* addCourse — добавляет к записи студента прослушанный курс */
float addCourse( int hours , float grade )
/* Приведённые ниже члены недоступны для внешних функций */
protected :
int semesterHours ; /* Количество прослушанных часов */
float gpa ; /* Средняя оценка */
} ;
_________________
182 стр. Часть 3. Введение в классы
Теперь члены semesterHours и gpa доступны только из других членов класса Student , и приведённый ниже пример работать не будет.
Student s ;
int main( int argc , char* pArgs[ ] )
{
/* Повысим свой рейтинг ( но не слишком сильно, иначе никто не поверит ) */
s.gpa = 3.5 ; /* Вызовет ошибку при компиляции */
float gpa = s.grade( ) ; /* Эта открытая функция считывает значение переменной, но вы не можете непосредственно изменить её значение извне */
return 0 ;
}
При попытке этой программы изменить значение gpa на этапе компиляции будет выдано сообщение об ошибке.

«Считается признаком хорошего тона не полагаться на значение защиты по умолчанию, а определить в самом начале объявления класса ключевое словоpublic илиprivate . Обычно класс начинают описывать с открытых членов, формируя интерфейс класса. Описание защищённых членов класса выполняется позже.»
[ Советы ]

«Члены класса могут быть защищены с помощью ещё одного ключевого слова —private . Кстати, по умолчанию при описании класса его члены считаются описанными именно какprivate . Разница междуprotected иprivate станет ясной при изучении наследования.»
[ Технические подробности ]
►Чем хороши защищённые члены...183
Теперь, когда вы немного познакомились с защищёнными членами, я приведу аргументы, обосновывающие их использование.
Защита внутреннего устройства класса...183
Ключевое слово protected позволяет исключить возможность установки gpa равным не допустимому для этой величины значению. Внешнее приложение сможет добавить курс, но не сможет изменить значение среднего балла непосредственно. Если имеется необходимость непосредственного изменения значения gpa , класс может предоставить открытую функцию, предназначенную для этой цели, например:
class Student
{
public :
Читать дальше