Статические члены данных (C++)

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

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

// static_data_members.cpp
class BufferedOutput
{
public:
   // Return number of bytes written by any object of this class.
   short BytesWritten()
   {
      return bytecount;
   }

   // Reset the counter.
   static void ResetCount()
   {
      bytecount = 0;
   }

   // Static member declaration.
   static long bytecount;
};

// Define bytecount in file scope.
long BufferedOutput::bytecount;

int main()
{
}

В предыдущем примере член bytecount объявляется в классе BufferedOutput, однако его определение должно находиться за пределами объявления класса.

На статические данные-члены можно ссылаться без указания ссылок на объект типа класса. Число байтов, записываемых с помощью объектов BufferedOutput, можно получить следующим образом.

long nBytes = BufferedOutput::bytecount;

Для того чтобы существовал статический член, не обязательно, чтобы существовали любые объекты типа класса. Обращаться к статическим членам также можно при помощи операторов выбора члена (. и –>). Например:

BufferedOutput Console;

long nBytes = Console.bytecount;

В предыдущем случае не ссылка на объект (Console) не вычисляется; возвращается значение статического объекта bytecount.

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

Тип статического члена не квалифицируется его именем класса. Таким образом, BufferedOutput::bytecount имеет тип long.

См. также

Ссылки

Классы, структуры и объединения