Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Если уж создавать класс, полностью отвечающий за своё состояние, то такие глобальные переменные, как регулятор напряжения, нужно хранить внутри класса, подальше от неаккуратных собачьих лап. Это и объясняет необходимость статических членов.
_________________
224 стр. Часть 3. Введение в классы
«Вы могли слышать, что статические члены также называют членами класса, поскольку они доступны для всех объектов класса. Чтобы подчеркнуть отличие от статических членов, обычные члены называют компонентами экземпляра или членами объекта, поскольку каждый объект имеет собственный набор таких членов.»
[ Советы ]
Использование статических членов...225
Статические данные-члены объявляются в классе с помощью ключевого слова static , как показано в приведённом ниже примере.
class Student
{
public :
Student( char *pName = "no name" ) : name( pName )
{
noOfStudents++ ;
}
~Student( )
{
noOfStudents-- ;
}
protected :
static int noOfStudents;
string name ;
} ;
Student s1 ;
Student s2 ;
Член noOfStudents входит в состав класса Student , но не входит в состав объектов s1 и s2 . Таким образом, для любого объекта класса Student существуют отдельные члены name и только один noOfStudents , который доступен для всех объектов класса Student .
"Хорошо,— спросите вы,— если место под noOfStudents не выделено ни в каком объекте класса Student , то где же он находится?" Ответ прост: это место не выделяется. Вы должны сами выделить для него место так, как показано ниже, int Student::noOfStudents = 0 ;
Этот своеобразный синтаксис выделяет место для статического члена класса и инициализирует его нулём. Статические данные-члены должны быть глобальными ( как статические переменные не могут быть локальными по отношению к некоторой функции ).
«Для любого члена, имя которого встречается вне класса, требуется указание класса, к которому он принадлежит.»
[ Помни! ]
«Такое выделение памяти вручную удивляет, но только до тех пор, пока вы не столкнётесь с проектами, в которых используется несколько модулей с исходным кодом. С++ должен знать, в каком именно.срр -файле надо выделить пространство для статической переменной. В случае нестатических членов это не составляет проблемы, так как память выделяется там и тогда, где и когда создаётся объект класса.»
[ Советы ]
_________________
225 стр. Глава 19. Статические члены
Обращение к статическим данным-членам...226
Правила обращения к статическим данным-членам те же, что и к обычным членам. Из класса к статическим членам обращаются так же, как и к другим членам класса. К открытым статическим членам можно обращаться извне класса, а к защищённым — нельзя, как и к обычным защищённым членам.
class Student
{
public :
Student( )
{
noOfStudents++ ; /* Обращение из класса */
/* ...остальная программа... */
}
static int noOfStudents ;
/* ...то же, что и раньше... */
} ;
void fn( Student & s1 , Student s2 )
{
/* Обращение к открытому статическому члену */
cout << "Количество студентов - "
<< s1.noOfStudents /* Обращение извне Класса */
<< "\n" ;
}
В функции fn( ) происходит обращение к noOfStudents с использованием объекта s1 . Однако, поскольку s1 и s2 имеют одинаковый доступ к члену noOfStudents , возникает вопрос: почему я выбрал именно s1 ? Почему я не использовал s2 ? На самом деле это не имеет значения. Вы можете обращаться к статическим членам, используя любой объект класса, например, так:
/* ...Класс определяется так же, как и раньше... */
void fn( Student & s1 , Student s2 )
{
/* Представленные команды приведут к идентичному результату */
cout << "Количество студентов - "
<< s1.noOfStudents <<"\n" ;
cout << "Количество студентов - "
<< s2.noOfStudents << "\n" ;
}
На самом деле нам вообще не нужен объект! Можно использовать просто имя класса, как показано в следующем примере:
/* ...Класс определяется так же, как и раньше... */
void fn( Student & s1 , Student s2 )
{
/* Результат остаётся неизменным */
cout << "Количество студентов - "
<< Student::noOfStudents
<< " \ n" ;
}
Независимо от того, будете ли вы использовать имя объекта или нет, С++ всё равно будет использовать имя класса.
_________________
226 стр. Часть 3. Введение в классы
«Объект, используемый для обращения к статическому члену, никак не обрабатывается, даже если это обращение явным образом указано в выражении. Для того чтобы понять, что я имею в виду, рассмотрим приведённый ниже пример.»
[ Технические подробности ]
class Student
{
static int noOfStudents ;
Student & nextStudent( ) ;
/* ...To же, что и раньше... */
} ;
void fn( Student & s )
{
cout << s.nextStudent( ).noOfStudents
<< "\n" ;
}
Функция-член nextStudent( ) в этом примере не должна вызываться. Всё, что нужно знать С++ для обращения к noOfStudents , — тип возвращаемого значения, а он может это выяснить и не выполняя данную функцию [ 15 ] .
Применение статических данных-членов...227
Существует бесчисленное множество областей применения статических данных-членов, но здесь мы остановимся лишь на нескольких из них. Во-первых, можно использовать статические члены для хранения количества объектов, задействованных в программе. Например, в классе Student такой счётчик можно проинициализировать нулём, а затем увеличивать его на единицу внутри конструктора и уменьшать внутри деструктора. Тогда в любой момент этот статический член будет содержать количество существующих в данный момент объектов класса Student . Однако следует помнить, что этот счётчик будет содержать количество объектов, существующих в данный момент ( включая временные объекты ), а не количество студентов [ 16 ] .
Ещё один способ использования статических членов заключается в индицировании выполнения определённого действия. Например, классу Radio может понадобиться инициализировать некие аппаратные средства при первом выполнении команды tune , но не перед последующими вызовами. С помощью статического члена можно указать, что первый вызов tune уже выполнил инициализацию. Кроме всего прочего, статический член может служить указателем безошибочности инициализации аппаратных средств.
Читать дальшеИнтервал:
Закладка: