Student s2 ;

Член noOfStudents входит в состав класса Student, но не входит в состав объектов s1 и s2. Таким образом, для любого объекта класса Student существуют отдельные члены name и только один noOfStudents, который доступен для всех объектов класса Student.

"Хорошо,— спросите вы,— если место под noOfStudents не выделено ни в каком объекте класса Student, то где же он находится?" Ответ прост: это место не выделяется. Вы должны сами выделить для него место так, как показано ниже, int Student::noOfStudents = 0 ;

Этот своеобразный синтаксис выделяет место для статического члена класса и инициализирует его нулём. Статические данные-члены должны быть глобальными ( как статические переменные не могут быть локальными по отношению к некоторой функции ).

«Для любого члена, имя которого встречается вне класса, требуется указание класса, к которому он принадлежит.»

[Помни!]

«Такое выделение памяти вручную удивляет, но только до тех пор, пока вы не столкнётесь с проектами, в которых используется несколько модулей с исходным кодом. С++ должен знать, в каком именно .срр-файле надо выделить пространство для статической переменной. В случае нестатических членов это не составляет проблемы, так как память выделяется там и тогда, где и когда создаётся объект класса.»

[Советы]

_________________

225 стр. Глава 19. Статические члены

<p id="chapter19.1.3"><strong><emphasis>Обращение к статическим данным-членам...226</emphasis></strong></p>

Правила обращения к статическим данным-членам те же, что и к обычным членам. Из класса к статическим членам обращаются так же, как и к другим членам класса. К открытым статическим членам можно обращаться извне класса, а к защищённым — нельзя, как и к обычным защищённым членам.

    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. Введение в классы

Перейти на страницу:

Все книги серии Для чайников

Похожие книги