Глава 11. Функции________________________________________259

Статические функции-члены

Начиная изучать математику в младших классах школы, мы знакомимся сначала с числами, затем со счетом, потом с элементарной арифметикой и т. д. С таким языком, как C++, дело обстоит несколько сложнее — он никак не желает укладываться в подобную линейную схему; многие его аспекты сильно зависят от контекста.

Вот и сейчас: говоря о функциях-членах, никуда не деться от классов. Поскольку функции являются важной частью классов, то до знакомства с функциями мы всерьез не затрагивали классы. К сожалению, статические функции-члены весьма важны для обсуждения функций. Так что мы попали в затруднительное положение: рассмотрели функции без изучения статических функций, теперь нам нужно заняться классами, а потом снова вернуться к функциям. Что поделать, не все просто; многие аспекты C++ зависят от контекста (т. е. некоторые вещи в разном контексте имеют различное значение), именно поэтому язык C++ считается сложным.

Ранее уже упоминалось, что статические переменные сохраняют свое значение и за пределами той функции, в которой были определены. Для этого переменные должны существовать вне функции и размещаться не в стеке. Таким образом, статические переменные в действительности неявно существуют за пределами своей области видимости. В этом отношении статические функции-члены похожи на статические переменные.

Однако если смысл статических переменных в сохранении своих значений за пределами функций, то смысл статических функций-членов — в их единственности. Сейчас вы поймете, что это значит. Вот, например, статическая функция-член в структуре.

1: // static.cpp — Пример статической функции-члена структуры

2: ftinclude <iostream.h>

3: ftinclude <string.h>

4: struct HAS_STATIC

5: {

6: static void ObjectAddress(); // объявление статической

// функции-члена 7: char name [15] ;

8: ) ;

9: void HAS_STATIC::ObjectAddress()

10 ( // функция преднамеренно пустая

11 )

12 void main() ;

13 (

14 Struct HAS_STATIC a;

15 strcpy( a.name, "a");

16 struct HAS_STATIC b;

17 strcpy( b.name, "b");

18 cout « "Адрес объекта " « a.name « " : " « &a « endl «