Как устроены защищённые члены...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 станет ясной при изучении наследования.»

[Технические подробности]