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

  Юрій  | 

  Оновл. 19 Сер 2021  | 

 352

Хоча перерахування і вважаються окремими типами даних в мові 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 Зірок (7 оцінок, середня: 5,00 з 5)
Loading...

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

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