Урок №62. Класи enum

  Юрій  | 

  Оновл. 16 Тра 2020  | 

 136

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

Коли C++ буде порівнювати змінні 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 компілятор більше не зможе неявно конвертувати значення енумераторів в цілі числа. Це добре! Але іноді можуть виникати ситуації, коли потрібно буде повернути цю особливість. У таких випадках ви можете явно конвертувати енумератор класу enum в тип int, використовуючи оператор static_cast:

Якщо ви використовуєте компілятор, що підтримує C++11, то немає ніякого сенсу використовувати звичайні перерахування замість класів enum.

Зверніть увагу, ключове слово class разом з ключовим словом static є одними з найбільш заплутаних в мові C++, оскільки мають різні значення в залежності від контексту. Хоча класи enum використовують ключове слово class, в C++ вони не вважаються “традиційними класами”. Про традиційні класи ми поговоримо трохи пізніше.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (4 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *