Ваше утверждение о том, что объявление нецелой константы в качестве статического члена класса "в ущерб требованию нецелой инициализации в файле cpp" не совсем верно, так сказать. Это требует определения в файле cpp, но это не «ущерб», это вопрос вашего намерения. Объект уровня пространства имен const
в C ++ по умолчанию имеет внутреннюю связь, что означает, что в исходном варианте объявление
const string MyStrConst = "String";
эквивалентно
static const string MyStrConst = "String";
т.е. он определит независимый MyStrConst
объект в каждой единице перевода, в которую включен этот заголовочный файл. Вы знаете об этом? Это было ваше намерение или нет?
В любом случае, если вам конкретно не нужен отдельный объект в каждой единице перевода, объявление константы MyStrConst
в вашем исходном примере не является хорошей практикой. Как правило, вы бы поместили неопределяющее объявление в заголовочный файл
extern const string MyStrConst;
и укажите определение в файле cpp
const string MyStrConst = "String";
, гарантируя, что вся программа использует один и тот же постоянный объект. Другими словами, когда дело доходит до нецелых констант, обычной практикой является определение их в файле cpp. Таким образом, независимо от того, как вы объявляете это (в классе или вне его), вам обычно всегда приходится сталкиваться с «ущербом» необходимости определять его в файле cpp. Конечно, как я сказал выше, с помощью констант пространства имен вы можете избавиться от того, что у вас есть в первом варианте, но это будет всего лишь пример «ленивого кодирования».
В любом случае, я не думаю, что есть причина слишком усложнять проблему: если константа имеет очевидную «привязанность» к классу, она должна быть объявлена как член класса.
P.S. Спецификаторы доступа (public
, protected
, private
) не контролируют видимость имени. Они только контролируют его доступность . Имя остается видимым в любом случае.