Глава 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 «
9«