Мне интересно узнать о преимуществах/недостатках различных деклараций констант и вариантов определения в С++. В течение самого долгого времени я просто объявлял их в верхней части файла заголовка перед определением класса:
//.h
const int MyConst = 10;
const string MyStrConst = "String";
class MyClass {
...
};
Несмотря на то, что это загрязняет глобальное пространство имен (которое, как я знаю, плохо, но никогда не нашел список стилей, почему это плохо), константы по-прежнему будут привязаны к отдельным единицам перевода, поэтому файлы, которые не включить этот заголовок не будет иметь доступа к этим константам. Но вы можете получить коллизии имен, если другие классы определяют константу с тем же именем, что, возможно, не так уж плохо, поскольку это может быть хорошим показателем области, которая может быть реорганизована.
Недавно я решил, что было бы лучше объявить специфические для класса константы внутри самого определения класса:
//.h
class MyClass {
public:
static const int MyConst = 10;
...
private:
static const string MyStrConst;
...
};
//.cpp
const string MyClass::MyStrConst = "String";
Видимость константы будет скорректирована в зависимости от того, используется ли константа только внутри класса или требуется для других объектов, которые используют класс. Это то, что я думаю, является лучшим вариантом сейчас, главным образом потому, что вы можете сохранить внутренние константы класса, приватные для класса, и любые другие классы, использующие общедоступные константы, будут иметь более подробную ссылку на источник константы (например, MyClass:: MyConst). Он также не будет загрязнять глобальное пространство имен. Хотя у него есть недостаток в требовании неинтегральной инициализации в файле cpp.
Я также подумал о переносе констант в их собственный заголовочный файл и обертывании их в пространстве имен, если какой-либо другой класс нуждается в константах, но не во всем определении класса.
Просто ищите мнения и, возможно, другие варианты, которые я еще не рассматривал.