2010-10-14 2 views
1

В принципе, если я не делаю все объекты, получаю копию всех значений перечисления?Это имеет значение, если я делаю enum в статическом классе?

пс: как всегда, ссылки на ваш ответ всегда приветствуются ...

+0

В чем преимущество этого? –

+0

@ Andersson: Мне нравится держать их в поле зрения, и имя класса часто является наиболее подходящим. Я полагаю, вы не можете создать пространство имен с тем же именем, что и класс. – nus

ответ

2

С ключевым словом enum вы фактически определяете тип, а не определяете хранилище как элемент данных.

Это как определение внутреннего класса, как это:

class X 
    { 
    private: 
     class InnerClass 
     { 
     ... 
     }; 
    }; 

определение InnerClass это просто определение. Он просто определяет тип в контексте внешнего класса X, поэтому InnerClass можно назвать только X :: InnerClass. Но это определенно не занимает места в экземплярах класса X.

Относительно замечания по перечислениям: значения перечисления на самом деле являются целыми числами, и эти целые числа используются в коде, где это необходимо. Обычно нет центрального хранилища всех значений перечисления. Перечисление просто определяет сопоставление между токеном и числовым значением, и везде маркер используется в вашем коде, компилятор заменяет его числовым значением.

+0

спасибо, ваш комментарий на ответе GMan на самом деле является ответом, на который я был lokking. Можете ли вы скопировать его в свой ответ, тогда я сделаю это принятым ответом. – nus

2

Вы не можете объявить вложенный тип (например, перечисления) статичен. Синтаксически.

0

Вы не можете, это не имеет смысла. Каждый экземпляр не сохраняет значения, они будут хранить значение a, которое происходит из перечисленных значений.

+0

Означает ли это, что любой константный член будет существовать только один раз в памяти, а не один раз для каждого экземпляра? – nus

+0

Значения перечисления на самом деле являются целыми числами, и эти целые числа используются в коде, где это необходимо. Обычно нет центрального хранилища всех значений перечисления. Перечисление просто определяет сопоставление между токеном и числовым значением, и везде маркер используется в вашем коде, компилятор заменяет его числовым значением. – Patrick

+0

@ufotds: Да. Это просто тип, у него нет хранилища. (Объект этого типа делает.) – GManNickG

0

Перечисления не содержат всех возможных значений. Различные возможные значения существуют только в коде во время компиляции. Во время выполнения каждый экземпляр перечисления является по существу интегральным значением.

0

enum {..} s не занимают места в вашей программе. Только объекты, объявленные как перечисленные типы, занимают любое пространство. Даже в этом случае вряд ли будет больше места, чем подходит в машинном регистре (поскольку они совместимы с целыми типами).

Единственное место, где когда-либо было какое-либо хранилище, связанное со всеми перечисленными именами и значениями, определенными для этого типа, является во время компиляции. Во время выполнения вся эта информация является неосновательной (и, следовательно, ее нет).

Смежные вопросы