С++ для начинающих

       

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


Функции-члены raiseInterest() и interest() обращаются к глобальному статическому члену _interestRate:

class Account {

public:

   void raiseInterest( double incr );

   double interest() { return _interestRate; }

private:

   static double  _interestRate;

};

inline void Account::raiseInterest( double incr )

{

  _interestRate += incr;

}

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



Поэтому лучше объявить такие функции-члены как статические. Это можно сделать следующим образом:

class Account {

public:

   static void raiseInterest( double incr );

   static double interest() { return _interestRate; }

private:

   static double  _interestRate;

};

inline void Account::raiseInterest( double incr )

{

  _interestRate += incr;

}

Объявление статической функции-члена почти такое же, как и нестатической: в теле класса ему предшествует ключевое слово static, а спецификаторы const или volatile запрещены. В ее определении, находящемся вне тела класса, слова static быть не должно.

Такой функции-члену указатель this не передается, поэтому явное или неявное обращение к нему внутри ее тела вызывает ошибку компиляции. В частности, попытка обращения к нестатическому члену класса неявно требует наличия указателя this и, следовательно, запрещена. Например, представленную ранее функцию-член dailyReturn() нельзя объявить статической, поскольку она обращается к нестатическому члену _amount.

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

#include <iostream>



Содержание раздела