Извините, когда я отвечаю на ваши вопросы не по порядку, это облегчает понимание таким образом.
Когда в заголовочном файле объявляется статическая переменная, ее область действия ограничивается файлом .h или для всех модулей.
Нет такой вещи как "область заголовочного файла". Заголовочный файл получает включенный в исходные файлы. Единицей перевода является исходный файл , включающий текст из заголовочных файлов. Все, что вы пишете в заголовочном файле, копируется в каждый, включая исходный файл.
Таким образом, статическая переменная, объявленная в заголовочном файле, похожа на статическую переменную в каждом отдельном исходном файле.
Поскольку объявление переменной static
означает, что это означает внутреннюю связь, каждая единица перевода #include
вашего файла заголовка получает свою собственную , индивидуальную переменную (которая не видна снаружи ваш переводческий блок). Обычно это не то, что вы хотите.
Я хотел бы знать, в чем разница между статическими переменными в заголовочном файле и объявленными в классе.
В объявлении класса static
означает, что все экземпляры класса совместно используют эту переменную-член; то есть у вас может быть сотни объектов этого типа, но всякий раз, когда один из этих объектов ссылается на переменную static
(или «класс»), это значение одинаково для всех объектов. Вы можете думать об этом как о «глобальном классе».
Также обычно статическая переменная инициализируется в файле .cpp при объявлении в классе, верно?
Да, одна (и только одна ) единица перевода должна инициализировать переменную класса.
Так что значит область действия статической переменной ограничена двумя единицами компиляции?
Как я уже сказал:
- Заголовок не является единицей компиляции,
static
означает совершенно разные вещи в зависимости от контекста.
Global static
ограничивает область применения единицей перевода. Класс static
означает глобальный для всех экземпляров.
Надеюсь, это поможет.
PS: Проверьте последний абзац ответа Чубсдада о том, как не следует использовать static
в C ++ для обозначения внутренней связи, но для анонимных пространств имен. (Потому что он прав. ;-))