►Оъявление статических функций-членов...228
Функции-члены также могут быть объявлены статическими. Подобно статическим данным-членам, они связаны с классом, а не с каким-либо отдельным объектом класса. Это означает, что обращение к статическим функциям-членам, как и к статическим данным-членам, не требует наличия объекта. Если объект и присутствует, то используется только его тип.
«Таким образом, оба вызова статической функции-члена number( ) в приведённой ниже программе корректны.»
[Диск]
//
/* CallStaticMember — два способа вызова */
/* статической функции-члена */
//
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <strings.h>
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. Введение в классы
Обратите внимание на то, как статическая функция-член обращается к статическим данным-членам. Поскольку статическая функция-член не связана с каким-либо объектом, она не может неявно обращаться к нестатическому члену. Таким образом, приведённый ниже пример неправилен.
class Student
{
public :
/* Приведённый ниже код неверен */
static char *sName( )
{
return pName ; /* Какое именно имя? */
}
/* ...всё остальное то же, что и ранее... */
protected :
char * pName ;
static int noOfStudents ;
} ;
Это не означает, что статические функции-члены не имеют доступа к нестатическим данным-членам. Рассмотрим следующий пример, в котором функция findName( ) используется для поиска объекта в связанном списке ( о том, как работают связанные списки, рассказывается в главе 14, "Указатели на объекты" ). Здесь приводится только относящаяся к нашему рассмотрению часть кода; всё остальное вы можете дописать самостоятельно, в качестве небольшого домашнего задания.
class Student
{
public :
Student ( char *pName )
{
/* Создаёт объект и добавляет его в список */
}
static Student* findName( char *pName )
{
/* Ищет объект в списке, на который указывает указатель pHead */
}
protected :
static Student *pHead ;
Student *pNext ;
char* pName ;
} ;
Student* Student::pHead = 0
Функция findName( ) имеет доступ к pHead, поскольку этот указатель доступен для всех объектов. Так как findName является членом класса Student, он имеет доступ к членам pNext объектов. Этот доступ позволяет функции проходить по списку в поисках требуемого объекта. Вот как используется такая функция.
int main( int argcs , char* pArgs[ ] )
{
Student s1( "Randy" ) ;
Student s2( "Jenny" ) ;
Student s3( "Kinsey" ) ;
Student *pS = s1.findName( "Jenny" ) ;
return 0 ;
}
_________________
229 стр. Глава 19. Статические члены
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ