|
Программирование >> Аргументация конструирования
повысим свой рейтинг (но не слишком сильно, иначе никто не поверит) s.gpa = 3.5; вызовет ошибку при компиляции float gpa = s.gradeO; эта открытая функция считывает значение переменной, но вы не можете непосредственно изменить ее значение извне return 0; При попытке этой программы изменить значение на этапе компиляции будет выдано сообщение об ошибке. Считается признаком хорошего тона не полагаться на значение защиты по умолчанию, а определить в самом начале объявления класса ключевое слово public или private. Обычно класс начинают описывать с открытых членов, формируя интерфейс класса. Описание защищенных членов класса выполняется позже. Члены класса могут быть защищены извне и с помощью еще одного ключевого слова - private. Кстати, по умолчанию при описании класса его члены считаются описанными именно как private. Разница между protected и private станет ясной при изучении наследования в главе 21, Наследование классов . Чеисхо/юши защищенные члены Теперь, когда вы немного познакомились с защищенными членами, я приведу аргументы, обосновывающие их использование. Защита внутреннего устройства класса Ключевое слово protected позволяет исключить возможность установки gpa равным не допустимому для этой величины значению. Внешнее приложение сможет добавить курс, но не сможет изменить значение среднего балла непосредственно. Если имеется необходимость непосредственного изменения значения gpa, класс может предоставить открытую функцию, предназначенную для этой цели, например: class Student { public: grade - делает то же, что и раньше float grade() return gpa; даем возможность изменения средней оценки float grade(float newGPA) float oldCPA = gpa; Проверяем допустимость значения if (newGPA > 0 S& newGPA <= 5.0) gpa = newGPA; return oldGPA; все остальное остается без изменений protected: int semesterHours; количество прослушанных часов float gpa; Добавление новой функции grade (float) позволяет внешним приложениям изменять содержимое gpa. Заметьте, что класс все равно не позволяет внешним функциям полностью контролировать содержимое своих защищенных членов. Внешнее приложение не может присвоить gpa любое значение, а только то, которое лежит в диапазоне между 0 и 5.0. Теперь класс Student обеспечивает внешний доступ к своим внутренним членам, одновременно не позволяя присвоить им недопустимое значение. Классы с ограниченным интерфейсом Теперь наш класс предоставляет ограниченный интерфейс. Чтобы использовать класс, достаточно знать, каковы его открытые члены, что они делают и какие аргументы принимают. Это значительно уменьшает количество информации, которую необходимо помнить для работы с классом. Кроме того, иногда изменяются условия работы программы либо выявляются новые ошибки, и программист должен изменить содержимое членов класса (если не логику его работы). В этом случае изменение только защищенных членов класса не вызывает изменений в коде внешнего приложения. О/ищение незащищенным членам Может случиться так, что потребуется предоставить некоторым внешним функциям возможность обращения к защищенным членам класса. Для такого доступа можно воспользоваться ключевым словом (друг). Друг всегда уступить готов место в шлюпке и круг.,. Иногда внешним функциям требуется прямой доступ к данным-членам. Без некоторого механизма дружественности программист был бы вынужден объявлять такие члены открытыми для всех, а значит, обращаться к этим членам могла бы любая внешняя функция. Это похоже на то, как вы оставляете соседям ключ от своего дома на время отпуска, чтобы они иногда проверяли его. Давать ключи не членам семьи не совсем хорошо, однако это куда лучше, чем оставлять дом открытым. Объявление друзей должно находиться в классе, который содержит защищенные члены. Такое объявление выполняется почти так же, как и объявление обычных прототипов, и должно содержать расширенное имя друга, включающее типы аргументов и возвращаемого значения. В приведенном ниже примере функция получает доступ ко всем членам класса Student. class Student; friend void initialize{Student*); public: те же открытые члены, что и раньше protected: int semesterHours; количество часов в семестре float gpa; эта функция - друг класса Student и имеет доступ к его защищенным членам void initialize(Student *pS) f теперь эти строки законны = 0; Одна и та же функция может одновременно быть объявлена другом нескольких классов. Это может быть удобно, например, для связи двух классов. Правда, такого рода связь не очень приветствуется, поскольку делает оба класса зависимыми друг от друга. Однако, если два класса взаимосвязаны по своей природе, их объединение может оказаться не столь плохим решением. class Student; class Teacher friend void registration(); protected: int noStudents; Student --pList [100] ; public: void assignGrades 0 ; class friend void rei t-:.- .t-. public: те же открытые члены, что и раньше protected: Teacher *рТ; int semesterHours; количество часов в семестре float gpa; В данном примере функция registration О может обращаться к обоим классам - и student и Teacher, связывая их на этапе регистрации, но при этом не входя в состав этих классов. Обратите внимание, что в первой строке примера объявляется класс Student, но не объявляются его члены. Запомните: такое описание класса называется предварительным и в нем описывается только имя класса. Предварительное описание нужно для чтобы другие классы, такие, например, как Teacher, могли обращаться к классу student. Предварительные описания используются тогда, когда два класса должны обращаться один к другому. Функция-член одного класса может быть объявлена как друг некоторого другого класса следующим образом: class Teacher те же члены, что и раньше public: void assignGrades О ; class Student { friend void Teacher::assignGrades(); public: те же открытые члены, что и раньше protected: int semesterHours; количество часов в семестре
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |