Главная->Інформатика та програмування->Содержание->Доступ к статическим функциям

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн

Доступ к статическим функциям

В приведенной программе у нас имеется статический элемент данных под име-

нем total, принадлежащий классу gamma. В этой переменной xранится информа-

ция о том, сколько объектов создано в классе. Ее значение увеличивается конст-

руктором и уменьшается деструктором.

Давайте предположим, что нам нужно иметь доступ к total, находясь вне

класса. В листинге можно увидеть функцию showtotal(), показывающую значе-

ние этой переменной. Каким образом получить доступ к этой функции?

Когда некоторый элемент данных объявляется статическим, на весь класс

выделяется единственная копия этого элемента, при этом не имеет значения,

сколько объектов класса мы создали. На самом деле может вообще не быть ни-

каких объектов, но нам интересно узнать даже об этом факте. Можно создать,

конечно, некое чудо в перьях для вызова нужного метода, как в приведенных

ниже строчках:

gamma dummyObj; //создать Объект только для того, чтобы иметь возможность вызвать функцию

dummyObj.showtotal(); //Вызов функции

Но, согласитесь, это выглядит некрасиво. По правилам хорошего тона не сле-

дует обращаться к объекту, когда мы делаем что-либо, относящееся к классу в це-

лом. Более целесообразно использовать просто имя класса и оператор явного

задания функции:

gamma::showtotal(); //Так правильнее

Тем не менее, такой прием не сработает, если showtotal() — обычный метод.

В этом случае, действительно, придется написать имя объекта, точку и назва-

ние функции. Хотите иметь доступ к showtotal(), используя только лишь имя

класса, — объявляйте ее статической. Это мы и проделали в STATFUNC, объявив

static void showtotal()

Объявленная таким образом функция будет иметь доступ просто через имя

класса. Вот пример работы программы:

Всего: 1

Всего: 3

ID: 1

ID: 2

ID: 3

                конец программы---  

Удаление ID 3

Удаление ID 2

Удаление ID 1

 

Здесь мы задаем один объект g1, после чего выводим значение total, оно

равно 1. Потом создаем g2 и gЗ и снова выводим значение total, на сей раз оно

уже равно 3.

Нумерация объектов

В класс gamma мы поместили еще одну функцию, предназначенную для вывода

идентификационных номеров его объектов. Эти ID положены равными перемен-

ной total в момент создания объекта, так что номер каждого объекта оказывается

уникальным. Функция showID() выводит ID своего объекта. В нашей программе

она вызывается трижды в выражениях

g1.showID();

g2.showID();

g3.showID();

Как показывают результаты работы программы, у каждого объекта имеется

действительно свой уникальный номер. G1 пронумерован 1, g2 — 2, gЗ — 3.

Деструкторы

После того как мы узнали, что объекты можно нумеровать, покажем одно инте-

ресное свойство деструкторов. STATFUNC выводит на экран сообщение «Конец

программы», это написано в последней строчке кода. Но, как показывает пример

работы программы, после вывода этой строчки еще кое-что происходит. А имен-

но, три объекта, которые были созданы в процессе работы программы, должны

быть удалены до ее завершения, чтобы восстановился доступ к памяти. Об этом

заботится компилятор, выполняя деструктор.

Вставив в деструктор выражение, выводящее на экран сообщение, мы можем

наблюдать за процессом его работы. Благодаря введенной нумерации, мы также

можем наблюдать, в каком порядке удаляются объекты. Как видим, удаление

происходит в порядке, обратном созданию. Можно предположить, что локаль-

ные объекты хранятся в стеке, и используется LIFO-подход.

 

19