Здавалка
Главная | Обратная связь

Статические поля класса.



Итак, поле класса можно объявить со служебным словом static. Память под такие поля резервируется при запуске программы, то есть еще до того, как программист явно создаст первый объект данного абстрактного типа.При этом все объекты, сколько бы их ни было, используют эту заранее созданную одну - единственную копию своего статического члена.

Статический член класса должен быть инициализирован после определения класса и до первого описания объекта этого класса. Данное действие производится с помощью так называемого полного или квалифицированного имени статического члена, которое имеет вид:

имя_класса::имя_статического_члена

Рассмотрим пример. Реализуем класс object_, в статическом члене которого хранится число существующих в каждый момент времени объектов типа object_.

# include <iostream># include <string.h>using namespace std; class object_{ char *str;public: //статическое поле класса static int num_obj; //конструктор object_ (char *s){ str = new char [strlen (s) + 1]; strcpy ( str, s ); cout <<"Create " << str <<'\n'; // увеличиваем значение счетчика num_obj ++ ; } //деструктор ~object_ (){ cout <<"Destroy " << str << '\n'; delete str; // уменьшаем значение счетчика num_obj --; } }; // Инициализация. Об этом говорит// ключевое слово int! int object_::num_obj = 0; // создание глобальных объектовobject_ s1 ("First global object."); object_ s2 ("Second global object."); // вспомогательная функцияvoid f (char *str) { // Локальный объект object_ s(str); // явное обращение к статическому полю // без указания объекта cout <<"Count of objects - " <<object_::num_obj<<".\n"; cout <<"Worked function f()" <<".\n";} void main () { // явное обращение к статическому полю cout <<"Now, count of objects " <<object_::num_obj<<".\n"; object_ M ("Object in main ()."); // обращение к статическому полю через объект cout <<"Now, count of objects" << M.num_obj <<".\n"; f ("Local object."); f ("Another local object."); cout << "Before finish main() count of objects - " <<object_::num_obj<<".\n";} Результаты работы программы: Create First global object.Create Second global object.Now, count of objects 2.Create Object in main ().Now, count of objects3.Create Local object.Count of objects - 4.Worked function f().Destroy Local object.Create Another local object.Count of objects - 4.Worked function f().Destroy Another local object.Before finish main() count of objects - 3.Destroy Object in main ().Destroy Second global object.Destroy First global object.

Примечание:Обратим внимание, что конструкторы для глобальных объектов вызываются до функции main (), а деструкторы после main().

На статические данные класса распространяются правила статуса доступа. Если статические данные имеют статус private, то к ним извне можно обращаться через компонентные функции. Другими словами, получается, что, если к моменту необходимости обращения к статическому полю типа private, объект класса еще не определен, обращение невозможно. Согласитесь, хотелось бы иметь возможность обойтись без имени конкретного объекта при обращении к статическим данным класса. Эта задача решается с помощью статической компонентной функции-метода.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.