    Или же можно объявить указатель и присвоить ему адрес члена balance 
следующим обрадом

   double TFirstClass: :*dataPtr = &TFirstClass::balance;	

   В любом случае, указатель dataPtr теперь ссылается на член balance класса 
TFirstClass. В действительности dataPtr не содержит адрес размещения в памяти, 
вместо этого в нем хранится смещение, по которому член balance размещается в 
объекте класса TFirstClass. Остается обратиться к адресованному члену через 
объект класса. Следующие операторы, например, инициализируют и отображают 
значение balance: 

    fс.balance = 123456 ;
    cout « "\nBalance=" « fc.*dataPtr ;

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

    Статические члены 

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

   clacc TAnyClass {
   public:
      static void GlobalInit( void ) ;
      ...
   );

   Статические функции-члены не могут быть виртуальными. Реализовать статические 
функции-члены следует так же, как и другие, предварив имя функции именем класса и 
оператором разрешения области видимости: 

    void TAnyClass::GlobalInit(void) 
    {
      ... // Операторы, которые необходимо выполнить 
    }

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

    TAnyClass::GlobalInit();	// Вызвать статическую функцию Globallnit() 

    Предполагается, что статическая функция-член, подобная Globallnit(), 
выполняет действия, касающиеся всех объектов типа TAnyClass. 
    В классах также могут объявляться статические данные-члены. Например, в классе 

    class TAnyClass {	
    private:	
       static char с;   // Статический член, хранящий данные 
    public: 
       char GetC(void) { return c; } 
    };	

член с объявляется закрытым статическим членом класса. (Статические 
данные-члены также могут быть защищенными и открытыми.) Существует лишь одна 
копия TAnyClass::с независимо от того, сколько определяется объектов класса 
TAnyClass в программе. Статические данные-члены должны определяться и 
инициализироваться в программе, обычно с помощью глобальных объявлений, 
подобных следующему: 

    char TAnyClass::с = 'q'; 

    В действительности с — глобальная переменная, доступная только 
функциям-членам TAnyClass. Далее можно определить объект класса TAnyClass, 
использующий с. Например, следующие операторы определяют объект х и вызывают 
функцию-член GetC(), отображающую символ 'q':	

    TAnyClass х;	
    cout « х.GetC();         // Отображает статический член с           

    Размещение объектов по заданным адресам	

    Иногда вам может понадобиться поместить объект в заданный участок памяти, 
например, в глобальный буфер в сегменте данных. Подобные объекты продолжают 
существовать и вне области их объявления, и иногда их называют "постоянными 
объектами".	
    В листинге 15.15 демонстрируется размещение объекта по заданному адресу. В 
программе также приводится пример непосредственного вызова деструктора — 
необычный прием, который может пригодиться для удаления объектов, созданных 
перегруженным оператором new, использующим нестандартные способы выделения памяти. 


    396     Часть III. Программирование на ANSI C++ 
