В принципе, если я не делаю все объекты, получаю копию всех значений перечисления?Это имеет значение, если я делаю enum в статическом классе?
пс: как всегда, ссылки на ваш ответ всегда приветствуются ...
В принципе, если я не делаю все объекты, получаю копию всех значений перечисления?Это имеет значение, если я делаю enum в статическом классе?
пс: как всегда, ссылки на ваш ответ всегда приветствуются ...
С ключевым словом enum вы фактически определяете тип, а не определяете хранилище как элемент данных.
Это как определение внутреннего класса, как это:
class X
{
private:
class InnerClass
{
...
};
};
определение InnerClass это просто определение. Он просто определяет тип в контексте внешнего класса X, поэтому InnerClass можно назвать только X :: InnerClass. Но это определенно не занимает места в экземплярах класса X.
Относительно замечания по перечислениям: значения перечисления на самом деле являются целыми числами, и эти целые числа используются в коде, где это необходимо. Обычно нет центрального хранилища всех значений перечисления. Перечисление просто определяет сопоставление между токеном и числовым значением, и везде маркер используется в вашем коде, компилятор заменяет его числовым значением.
спасибо, ваш комментарий на ответе GMan на самом деле является ответом, на который я был lokking. Можете ли вы скопировать его в свой ответ, тогда я сделаю это принятым ответом. – nus
Вы не можете объявить вложенный тип (например, перечисления) статичен. Синтаксически.
Вы не можете, это не имеет смысла. Каждый экземпляр не сохраняет значения, они будут хранить значение a, которое происходит из перечисленных значений.
Означает ли это, что любой константный член будет существовать только один раз в памяти, а не один раз для каждого экземпляра? – nus
Значения перечисления на самом деле являются целыми числами, и эти целые числа используются в коде, где это необходимо. Обычно нет центрального хранилища всех значений перечисления. Перечисление просто определяет сопоставление между токеном и числовым значением, и везде маркер используется в вашем коде, компилятор заменяет его числовым значением. – Patrick
@ufotds: Да. Это просто тип, у него нет хранилища. (Объект этого типа делает.) – GManNickG
Перечисления не содержат всех возможных значений. Различные возможные значения существуют только в коде во время компиляции. Во время выполнения каждый экземпляр перечисления является по существу интегральным значением.
enum {..}
s не занимают места в вашей программе. Только объекты, объявленные как перечисленные типы, занимают любое пространство. Даже в этом случае вряд ли будет больше места, чем подходит в машинном регистре (поскольку они совместимы с целыми типами).
Единственное место, где когда-либо было какое-либо хранилище, связанное со всеми перечисленными именами и значениями, определенными для этого типа, является во время компиляции. Во время выполнения вся эта информация является неосновательной (и, следовательно, ее нет).
В чем преимущество этого? –
@ Andersson: Мне нравится держать их в поле зрения, и имя класса часто является наиболее подходящим. Я полагаю, вы не можете создать пространство имен с тем же именем, что и класс. – nus