Перечисления enum — различия между версиями
Ulysses (обсуждение | вклад) |
Ulysses (обсуждение | вклад) (+ scoped enums) |
||
Строка 1: | Строка 1: | ||
Перечисление enum это тип, который может хранить набор именованных целочисленных значений, заданных пользователем. | Перечисление enum это тип, который может хранить набор именованных целочисленных значений, заданных пользователем. | ||
<source lang="cpp">enum {FOR, AUTO, BREAK};</source> | <source lang="cpp">enum {FOR, AUTO, BREAK};</source> | ||
− | + | объявляет три целочисленных константы, называемые ''элементами перечисления'', и присваивает им значения. Объявление типа enum может находиться в cpp-файле на самом верхнем уровне (то есть снаружи от функций), а также в заголовочных файлах (чтобы согласованно использовать имена констант в разных cpp-файлах). | |
По умолчанию, элементам перечисления присваиваются значения начиная с нуля; значение для каждого следующего элемента увеличиваются на единицу. Таким образом, в примере выше <tt>FOR == 0, AUTO == 1 и BREAK == 2</tt>. Перечислению можно присвоить имя. Например: | По умолчанию, элементам перечисления присваиваются значения начиная с нуля; значение для каждого следующего элемента увеличиваются на единицу. Таким образом, в примере выше <tt>FOR == 0, AUTO == 1 и BREAK == 2</tt>. Перечислению можно присвоить имя. Например: | ||
Строка 9: | Строка 9: | ||
Имеем <tt>FOR == 0, AUTO == 3 и BREAK == 4</tt>. | Имеем <tt>FOR == 0, AUTO == 3 и BREAK == 4</tt>. | ||
− | После своего | + | После своего объявления перечисление используется почти так же, как и целые типы. Можно объявлять переменные или параметры функций соответствующего типа (в нашем примере — типа keyword). Однако зачастую именами из типа перечисления пользуются как обычными целочисленными константами и сравнивают с ними переменные обычных целочисленных типов, например int. Тем не менее, если функция в качестве параметра должна принимать элемент перечисления, то лучше явно указать в качестве типа этого параметра имя перечисления, а не просто int: |
<source lang="cpp">void processKeyword(keyword kw);</source> | <source lang="cpp">void processKeyword(keyword kw);</source> | ||
Вызов такой функции может выглядеть так: | Вызов такой функции может выглядеть так: | ||
Строка 15: | Строка 15: | ||
'''Для обработки элементов перечислений внутри функций обычно используют [[оператор switch]]'''. | '''Для обработки элементов перечислений внутри функций обычно используют [[оператор switch]]'''. | ||
− | Стоит учитывать, что | + | Стоит учитывать, что перечисления не образуют ''области видимости'' (''scope''), потому имена в различных перечислениях должны отличаться друг от друга (и от других констант и имён функций). При этом значения различных элементов внутри одного перечисления могут совпадать. В '''C++11''' появились <tt>enum class</tt>'ы (другое название: ''scoped enums''), которые образуют отдельную область видимости и таким образом снимают упомянутое ограничение на различные имена. Для их использования достаточно добавить слово <tt>class</tt> после слова <tt>enum</tt> при объявлении. Более подробно об этом новшестве можно прочесть в [http://sergeyteplyakov.blogspot.ru/2012/05/c-11-faq.html#enum FAQ по C++11 от Б. Страуструпа] (русский перевод). |
− | + | Для элементов перечислений, как и для других константных значений, часто используют ''имена в верхнем регистре''. | |
=== См. также === | === См. также === |
Текущая версия на 17:29, 18 сентября 2014
Перечисление enum это тип, который может хранить набор именованных целочисленных значений, заданных пользователем.
enum {FOR, AUTO, BREAK};
объявляет три целочисленных константы, называемые элементами перечисления, и присваивает им значения. Объявление типа enum может находиться в cpp-файле на самом верхнем уровне (то есть снаружи от функций), а также в заголовочных файлах (чтобы согласованно использовать имена констант в разных cpp-файлах).
По умолчанию, элементам перечисления присваиваются значения начиная с нуля; значение для каждого следующего элемента увеличиваются на единицу. Таким образом, в примере выше FOR == 0, AUTO == 1 и BREAK == 2. Перечислению можно присвоить имя. Например:
enum keyword {FOR, AUTO, BREAK};
Элементам перечисления можно задавать значения явно. Если задана только часть значений, то нумерация продолжается автоматически начиная с последнего указанного значения, например:
enum keyword {FOR, AUTO = 3, BREAK};
Имеем FOR == 0, AUTO == 3 и BREAK == 4.
После своего объявления перечисление используется почти так же, как и целые типы. Можно объявлять переменные или параметры функций соответствующего типа (в нашем примере — типа keyword). Однако зачастую именами из типа перечисления пользуются как обычными целочисленными константами и сравнивают с ними переменные обычных целочисленных типов, например int. Тем не менее, если функция в качестве параметра должна принимать элемент перечисления, то лучше явно указать в качестве типа этого параметра имя перечисления, а не просто int:
void processKeyword(keyword kw);
Вызов такой функции может выглядеть так:
processKeyword(BREAK);
Для обработки элементов перечислений внутри функций обычно используют оператор switch.
Стоит учитывать, что перечисления не образуют области видимости (scope), потому имена в различных перечислениях должны отличаться друг от друга (и от других констант и имён функций). При этом значения различных элементов внутри одного перечисления могут совпадать. В C++11 появились enum class'ы (другое название: scoped enums), которые образуют отдельную область видимости и таким образом снимают упомянутое ограничение на различные имена. Для их использования достаточно добавить слово class после слова enum при объявлении. Более подробно об этом новшестве можно прочесть в FAQ по C++11 от Б. Страуструпа (русский перевод).
Для элементов перечислений, как и для других константных значений, часто используют имена в верхнем регистре.