При описании / наблюдении какого-либо атрибута какой-либо системы вы можете обнаружить, что этот атрибут может иметь любое значение из набора limited . Назовите эти значения, присвойте каждому целочисленное значение (код), соберите их в перечислении, и вы определили тип этого атрибута. Все действия, связанные с этим атрибутом, теперь могут использовать этот тип.
Пример: для некоторой системы мы можем рассматривать ее состояние как один из ее атрибутов. Мы можем наблюдать это и сказать, что оно может быть в «неинициализированном» состоянии, в состоянии «инициализация», «активное» или «незанятое» состояние (не стесняйтесь добавлять больше состояний здесь ...). Если вы хотите выполнить какое-либо действие в этой системе, но которое зависит от текущего состояния, как вы передадите информацию о состоянии в это действие (функцию)? Вы можете передавать строки «неинициализированный», «инициализация» ... но более эффективный, простой и безопасный от ошибок будет, если вы передадите только одно целое число из набора:
enum State
{
Uninitialized,
Initialization,
Active,
Idle
};
Эта функция будет иметь State в качестве аргумента и может использовать переключатель при решении, что делать в зависимости от текущего состояния:
void foo(..., const State state,...)
{
...
switch(state)
{
case Uninitialized:
cout << "Uninitialized" << endl;
break;
case Initialization:
...
}
...
}
Использование типа перечисления для описания ограниченного набора значений атрибута безопаснее, чем использование набора #defines и целочисленной переменной. Например. если у вас есть:
#define UNINITIALIZED 0
#define INITIALIZATION 1
#define ACTIVE 2
#define IDLE 3
и
int nState;
ничто не может помешать вам присвоить любое целочисленное значение nState:
nState = 4; // What state is 4?
Если вы используете перечисление:
State state;
Вы не можете присвоить ему произвольное целочисленное значение, но только перечислитель (хотя базовый тип для перечисления целочисленный! - см. this ):
state = Active;