►Оъявление статических функций-членов...228

We use cookies. Read the Privacy and Cookie Policy

Функции-члены также могут быть объявлены статическими. Подобно статическим данным-членам, они связаны с классом, а не с каким-либо отдельным объектом класса. Это означает, что обращение к статическим функциям-членам, как и к статическим данным-членам, не требует наличия объекта. Если объект и присутствует, то используется только его тип.

«Таким образом, оба вызова статической функции-члена 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. Статические члены