Статические члены (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
.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по