Как именно работают enum перечисления
Не могу понять как работают перечисления с точки зрения выделения памяти. Вот есть перечисление:
enum Colors
{
WHITE,
YELLOW,
GREEN
};
Память тут еще не выделена - ведь так? Мы по сути создали шаблон. Но если память не выделена, то почему я могу присвоить переменной значение одного из перечислителей?
int main
{
int a = YELLOW;
}
int a получила значение 1, которое по умолчанию получил перечислитель YELLOW 1, но как? Я ведь даже не создавал обьект типа Colors, как это нужно в случае enum class
Ответы (2 шт):
enum объявляют не переменные, а именованные числа. Никаких областей памяти для этого не выделяется. Очень похоже работает макрос define.
# define dYELLOW 2
enum Colors { eYELLOW = 2 } ;
int x = dYELLOW ;
int y = eYELLOW ;
Но в enum есть область видимости в пространстве имён Colors. А в макросе до ручного уничтожения #undef.
Тип в перечислениях enum это int (по-умолчанию). А в макросе всё-что угодно.
Если непонятно, где все эти числа в программе, то посмотрите ассемблерный код :
x:
.long 2
y:
.long 2
В ассемблере есть переменные x и y. Им при старте программы заданы числа 2. Никаких именованных числел dYELLOW и eYELLOW в коде нет.
Вас же не смущает, например,
#define YELLOW 1
int a = YELLOW;
при том, что вы ничего не создавали? :) По сути, enum и есть, как вы сказали, шаблон. Только в нем, пока не сказано иное, нумерация идет от 0. Но вы в любой момент можете ее изменить -
enum Val {
A, // 0
B, // 1
С = 15, // 15
D, // 16 (продолжение счета)
E // 17
};