Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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 :
/* grade — делает то же, что и раньше */
float grade( )
{
return gpa ;
}
/* Даём возможность изменения средней оценки */
float grade( float newGPA )
{
float oldGPA = gpa ;
/* Проверяем допустимость значения */
if ( newGPA > 0 && newGPA <= 4.0 )
{
gpa = newGPA ;
}
return oldGPA ;
}
/* ...всё остальное остаётся без изменений */
protected :
int semesterHours ; /* Количество прослушанных часов */
float gpa ;
} ;
_________________
183 стр. Глава 15. Защищённые члены класса: не беспокоить!
Добавление новой функции grade( float ) позволяет внешним приложениям изменять содержимое gpa . Заметьте, что класс всё равно не позволяет внешним функциям полностью контролировать содержимое своих защищённых членов. Внешнее приложение не может присвоить gpa любое значение, а только то, которое лежит в диапазоне между 0 и 4.0.
Теперь класс Student обеспечивает внешний доступ к своим внутренним членам, одновременно не позволяя присвоить им недопустимое значение.
Классы с ограниченным интерфейсом...184
Теперь наш класс предоставляет ограниченный интерфейс. Чтобы использовать класс, достаточно знать, каковы его открытые члены, что они делают и какие аргументы принимают. Это значительно уменьшает объём информации, которую необходимо помнить для работы с классом.
Кроме того, иногда изменяются условия работы программы либо выявляются новые ошибки, и программист должен изменить содержимое членов класса ( если не логику его работы ). В этом случае изменение только защищённых членов класса не вызывает изменений в коде внешнего приложения.
Ещё одна причина — едва ли не самая важная — в ограниченности человеческих возможностей удержать в голове большое количество объектов и связей между ними. Использование строго ограниченного интерфейса класса позволяет программисту отвлечься от деталей реализации, скрытых за этим интерфейсом. Соответственно, разработчик класса может не думать о том, как именно будет использоваться интерфейс разрабатываемого им класса.
►Обращение к защищённым члена...184
Может случиться так, что потребуется предоставить некоторым внешним функциям возможность обращения к защищённым членам класса. Для такого доступа можно воспользоваться ключевым словом friend ( друг ).
Иногда внешним функциям требуется прямой доступ к данным-членам. Без некоторого механизма "дружественности" программист был бы вынужден объявлять такие члены открытыми для всех, а значит, обращаться к этим членам могла бы любая внешняя функция.
Это похоже на то, как вы порой оставляете соседям ключ от своего дома на время отпуска, чтобы они иногда проверяли его. Давать ключи не членам семьи не совсем хорошо, однако это куда лучше, чем оставлять дом открытым.
Объявление друзей должно находиться в классе, который содержит защищённые члены ( что является ещё одним аргументом в пользу того, чтобы функций-друзей было как можно меньше ). Подобное объявление выполняется почти так же, как и объявление обычных прототипов, и должно содержать расширенное имя друга, включающее типы аргументов и возвращаемого значения. В приведённом ниже примере функция initialize( ) получает доступ ко всем членам класса Student .
_________________
184 стр. Часть 3. Введение в классы
class Student ;
{
friendvoid initialize( Student* ) ;
public :
/* Те же открытые члены, что и раньше */
Читать дальшеИнтервал:
Закладка: