} ;
void fn( Student & s )
{
cout << s.nextStudent( ).noOfStudents
<< "\n" ;
}
Функция-член nextStudent( ) в этом примере не должна вызываться. Всё, что нужно знать С++ для обращения к noOfStudents , — тип возвращаемого значения, а он может это выяснить и не выполняя данную функцию [ 15 ] .
Применение статических данных-членов...227
Существует бесчисленное множество областей применения статических данных-членов, но здесь мы остановимся лишь на нескольких из них. Во-первых, можно использовать статические члены для хранения количества объектов, задействованных в программе. Например, в классе Student такой счётчик можно проинициализировать нулём, а затем увеличивать его на единицу внутри конструктора и уменьшать внутри деструктора. Тогда в любой момент этот статический член будет содержать количество существующих в данный момент объектов класса Student . Однако следует помнить, что этот счётчик будет содержать количество объектов, существующих в данный момент ( включая временные объекты ), а не количество студентов [ 16 ] .
Ещё один способ использования статических членов заключается в индицировании выполнения определённого действия. Например, классу Radio может понадобиться инициализировать некие аппаратные средства при первом выполнении команды tune , но не перед последующими вызовами. С помощью статического члена можно указать, что первый вызов tune уже выполнил инициализацию. Кроме всего прочего, статический член может служить указателем безошибочности инициализации аппаратных средств.
И наконец, в статических членах можно хранить указатель на первый элемент связанного списка. Таким образом, статические члены могут содержать любую информацию "общего использования", которая будет доступна для всех объектов и во всех функциях ( не стоит забывать, однако, что чрезмерное использование статических переменных усложняет поиск ошибок в программе ).
___________________
15Вообще говоря, это зависит от используемого компилятора. Так, тот же Dev-C++ вызовет данную функцию, в чём легко убедиться, скомпилировав и выполнив приведённый пример ( дополнив его, естественно, функцией main( ) , в которой вызывается fn( ) ). — Прим. ред.
16Ещё одно замечание: в этом случае вы должны позаботиться о том, чтобы счётчик увеличивался во всех конструкторах, включая конструктор копирования. — Прим. ред.
_________________
227 стр. Глава 19. Статические члены
►Оъявление статических функций-членов...228
Функции-члены также могут быть объявлены статическими. Подобно статическим данным-членам, они связаны с классом, а не с каким-либо отдельным объектом класса. Это означает, что обращение к статическим функциям-членам, как и к статическим данным-членам, не требует наличия объекта. Если объект и присутствует, то используется только его тип.

«Таким образом, оба вызова статической функции-членаnumber( ) в приведённой ниже программе корректны.»
[ Диск ]
//
/* CallStaticMember — два способа вызова */
/* статической функции-члена */
//
#include
#include
#include
#include
using namespace std ;
class Student
{
public :
Student( char* pN = "no name" )
{
pName = new char[ strlen( pN ) + 1 ] ;
if ( pName )
{
strcpy( pName , pN ) ;
}
noOfStudents++ ;
}
~Student ( ) { noOfStudents-- ; }
static int number( ) { return noOfStudents ; }
/* ...Всё прочее — как и раньше... */
protected :
char* pName ;
static int noOfStudents ;
} ;
int Student::noOfStudents = 0 ;
int main( int argcs , char* pArgs[ ] )
{
/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */
setlocale ( LC_ALL , ".1251" ) ;
Student s1( "Chester" ) ;
Student s2 ( "Scooter" ) ;
cout << "Количество студентов — "
<< s1.number( ) << endl ;
cout << " Количество студентов — "
<< Student::number( ) << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ;
return 0 ;
}

Количество студентов — 2
Количество студентов — 2
Press any key to continue...
_________________
228 стр. Часть 3. Введение в классы
Обратите внимание на то, как статическая функция-член обращается к статическим данным-членам. Поскольку статическая функция-член не связана с каким-либо объектом, она не может неявно обращаться к нестатическому члену. Таким образом, приведённый ниже пример неправилен.
Читать дальше