Перечисления в С++ (enum)

Помечено: , ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 4 дн., 18 час. назад.

  • Автор
    Сообщения
  • #5567
    @admin

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

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

    enum EnumType {
      // элементы перечисления через запятую
    }

    При этом название перечисления (EnumType) является типом данных, с помощью которого мы сможем объявить переменную типа перечисления:

    EnumType myEnum;

    Например, новый тип данных, который обозначает день недели, мы объявим вот так:

    enum WeekDays {
      Sunday, Monday, Tuesday, 
      Wednesday, Thursday, 
      Friday, Saturday
    };

    При этом значение Mondey приравнивается к 1, Tuesday — к значению 2 и т.д. Но если мы при объявлении этого перечисления напишем, скажем, кот так: Wednesday = 17, то значение Wednesday будет 17, значение Thursday — это 18 и т.д. Попробуйте составить какую-нибудь программу с этим перечислением или придумайте свои типы данных, поинтересней.

    Примеры использования enum

    Используется эта конструкция очень часто, например тут: Спрайтовая анимация на QGraphicsScene Qt описана игрушка, в которой персонаж может двигаться в разные стороны. Дак вот, переменная, которая хранит направление движения имеет тип перечисления:

    enum class ActorActions {
        Stay, Up, Down, Left, Right
    };

    Правда тут используется не просто enum, а enum class — прочитать про особенности которого можно тут: Зачем нужен enum class .

    Также, обратите внимание как часто используются enum-ы в стандартной библиотеке… Вы хотите открыть файл — тогда вы пишите что-то такое:
    fs.open ("test.txt", fstream::in | fstream::out | fstream::app);

    Вот эти fstream::out — не что иное как перечисления. А как их умудрились описать так, чтобы использовать совместно с оператором логического ИЛИ — можно узнать тут: enum и наложение масок.

    В начале я говорил, что без enum почти всегда можно обойтись. Ну, в самом деле, кто мне мешает вместо Monday везде писать 2 и радоваться? — дело в том, что такая техника дает нечитаемый код. Откуда другому человеку знать с какого дня у вас начинается неделя? — целые страны первым днем считают воскресенье, а кто-нибудь обязательно начнет нумерацию с единицы, а не так как вы… Решение очевидно — именовать константы. Именовать — хорошо, но enum позволяет еще и сгруппировать, а это еще лучше. Впрочем, это тесня связано с понятием Чистоты кода.

Для ответа в этой теме необходимо авторизоваться.