Урок 59. Классы enum

   ⁄ 

 Обновлено 7 мая 2017

  ⁄   

Хоть перечисления считаются отдельными типами данных в C++, они не столь безопасны, как кажутся на первый взгляд, и в некоторых случаях позволят вам делать вещи, которые не имеют смысла. Рассмотрим следующий пример:

Когда C++ будет сравнивать переменные fruit и color, он неявно преобразует fruit и color в целочисленные значения и сравнит их как целые числа. Так как значениями этих двух переменных являются перечислители, которым присвоено значение 0, то это означает, что в примере выше fruit будет равен color. А это не совсем то, что должно быть, так как fruit и color из разных перечислений и их вообще нельзя сравнивать (фрукт и цвет)! С обычными перечислителями нет способа предотвратить подобные сравнения.

Но в C++ 11 появляется новое понятие — класс enum (или перечисление с областью видимости), который добавляет перечислению, как вы уже могли понять, локальную область видимости с её правилами и строгие правила типов. Для создания такого класса нужно просто добавить ключевое слово class сразу после enum. Например:

Стандартные перечислители находятся в одной области с самим перечислением (глобальная область видимости), поэтому вы можете напрямую получать к ним доступ (например, PINK). Однако с добавлением класса, который ограничивает область видимости каждого перечислителя к его перечислению, для доступа потребуется использовать оператор разрешения области видимости (например, Colors::PINK). Это значительно снижает риск возникновения конфликтов имен.

Поскольку перечислители являются частью класса enum, то необходимость добавлять префиксы к идентификаторам отпадает (например, можно использовать просто PINK вместо COLOR_PINK, так как Colors::COLOR_PINK уже излишне).

А строгие правила типов означают, что каждый класс enum считается уникальным типом. Это означает, что компилятор не сможет неявно сравнивать перечислители с разных перечислений. Если вы попытаетесь это сделать, компилятор выдаст ошибку, как в примере выше.

Однако учтите, что вы можете сравнивать перечислители внутри одного класса enum (так как они одного типа):

С классами enum компилятор больше не сможет неявно конвертировать значения перечислителей в целые числа. В общем, это хорошо. Но иногда могут быть ситуации, когда нужно будет вернуть эту особенность. В таких случаях вы можете явно преобразовать перечислитель класса enum в int, используя static_cast:

Если вы используете компилятор C++ 11, то нет смысла использовать обычные перечисления вместо классов enum.

Обратите внимание, ключевое слово class вместе с ключевым словом static является одним из самых запутанных в языке C++, поскольку может иметь разные значения в зависимости от контекста. Хотя классы enum используют ключевое слово class, в C++ они не считаются традиционными «классами». О традиционных классах мы поговорим позже.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (7 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *