Фон для статических функций-членов
static
Функции-члены могут вызываться в любое время, даже если вы не создали экземпляр объекта класса.Когда они вызываются:
- , они не получают неявный указатель
this
, как это делают нестатические функции-члены - , поэтому они неявно автоматически распознают, если естьлюбые экземпляры класса, не говоря уже о том, где в памяти находятся экземпляры.
- они могут работать со статическими переменными-членами, которые также не зависят от экземпляров объекта.
Чтобы понять вышеизложенное, можно представить, что статические члены класса или структуры похожи на автономные не-члены, за исключением того, что:
- статические члены эффективно дружат с классом
- статические члены находятся в области видимости класса с целью поиска идентификаторов для сопоставления с вызовами функций или для поиска переменной
- статические члены могут быть защищены или закрыты в этой области
Итак, они являются гибридом поведения, не являющегося членом и членом.
Как конструкция объекта связана со статической / нестатической мембранойers and threading
Конструктор объектов может использовать статические члены класса, либо вызывая функции, либо используя переменные.Но помните, что статическая переменная-член похожа на единственную глобальную переменную, за исключением того, что она находится в области именования класса: любой код, использующий эту переменную - независимо от того, является ли этот код статической или нестатической функцией-членом или функцией, не являющейся членом - должен взаимодействовать сдругой код, использующий переменную, потому что значение является общим.Если вы пишете многопоточный код, вам нужно будет использовать мьютекс или подобное для его защиты точно так же, как для переменной, не являющейся членом.
Построение статических переменных-членов
Тамодна важная проблема, которую, я думаю, вы можете задаться вопросом: когда вызывается конструктор для статических переменных-членов?В соответствии со Стандартом 9.4.2 (здесь я ссылаюсь на окончательный вариант C ++ 98):
-7- Статические члены данных инициализируются и уничтожаются точно так же, как нелокальные объекты (базовые.start.init, basic.start.term).
Важно отметить, что сценарий наихудшего / последнего случая описан в 3.6.2:
-3- Это определяется реализацией независимо от того, динамическая инициализация или нет (dcl.init,class.static, class.ctor, class.expl.init) объекта области именного пространства выполняется перед первым оператором main.Если инициализация откладывается до некоторого момента времени после первого оператора main, она должна произойти до первого использования любой функции или объекта, определенных в той же единице перевода, что и объект, который должен быть инициализирован. *