Какое влияние оказывает статическая константа на член пространства имен
// MyClass.h
namespace MyNamespace {
static const double GasConstant = 1.987;
class MyClass
{
// constructors, methods, etc.
};
}
Ранее я объявлял GasConstant в объявлении MyClass (и имел отдельное определение в исходном файле, поскольку С++ не поддерживает инициализацию нецелого типа const
). Однако мне нужно получить к нему доступ из других файлов, а также логически, похоже, что он должен находиться на уровне пространства имен.
Мои вопросы: какой эффект имеет static const
в этом случае? Ясно, что const
означает, что я не могу назначить новое значение GasConstant, но что означает статический член в пространстве имен. Является ли это похожим на static в области файлов, где элемент недоступен вне устройства?
Ответы
Ответ 1
Использование static
в области пространства имен is было * устарело в С++. Обычно это можно увидеть только в исходном файле, где его действие заключается в том, чтобы сделать переменную локальной в этом исходном файле. То есть другой исходный файл может иметь переменную с точно таким же именем без конфликта.
В С++ рекомендуемый способ сделать переменные локальными в исходном файле - использовать анонимное пространство имен.
Я думаю, справедливо сказать, что static
в заголовке вашего кода просто неверно.
* Как отметил Том в комментариях (и в этом ответе), комитет С++ отменил решение об отказе от использования static
в области файлов, на что это использование всегда будет частью языка (например, для совместимости с C).
Ответ 2
MSDN говорит:
При изменении переменной ключевое слово static указывает, что переменная имеет статическую продолжительность (это выделяется при запуске программы и освобождается, когда программа заканчивается) и инициализирует его до 0, если другое значение указано. При изменении переменная или функция в области файлов, ключевое слово static указывает, что переменная или функция имеет внутренний (его имя не видно из вне файла, в котором он находится объявлена).
Помните, что в том числе заголовочные файлы означают замену "#include" -directive фактическим кодом файла заголовка. Таким образом, статические переменные будут видны только в файле .cpp(который скомпилирован), который включает в себя два файла заголовка.
Таким образом, каждый "cpp" файл, включая заголовки, будет иметь собственную статическую переменную.
Ответ 3
Если это файл заголовка, то static
не имеет никакого эффекта в этом случае. const
объекты уже имеют внутреннюю связь по умолчанию в С++, поэтому независимо от того, объявляете ли вы ее с помощью static
или без static
, не имеет никакого значения.
Я предполагаю, что вы просто переместили объявление из класса в пространство имен. Но static
имеет совершенно иное значение в контексте объявления класса и в контексте пространства имен. Внутри класса вам понадобилось static
. В пространстве имен static
является излишним.