Тема 19. Перерахування (перелічуваний тип даних).pdf
Document Details
Uploaded by TimeHonoredVector2117
Full Transcript
Тема 19. Перерахування (перелічуваний тип даних) Мова C++ дозволяє програмістам створювати свої власні (користувацькі) типи даних. Перелічуваний тип даних Перерахування (або “перелічуваний тип даних”) — це тип даних, де будь-яке значення (енумератор) визначається як символьна константа. Оголосити п...
Тема 19. Перерахування (перелічуваний тип даних) Мова C++ дозволяє програмістам створювати свої власні (користувацькі) типи даних. Перелічуваний тип даних Перерахування (або “перелічуваний тип даних”) — це тип даних, де будь-яке значення (енумератор) визначається як символьна константа. Оголосити перерахування можна за допомогою ключового слова enum. Наприклад: // Оголошуємо нове перерахування Colors enum Colors { // Нижче знаходяться енумератори - всі можливі значення цього типу даних. // Кожний енумератор розділяється комою (НЕ крапкою з комою) COLOR_RED, COLOR_BROWN, COLOR_GRAY, COLOR_WHITE, COLOR_PINK, COLOR_ORANGE, COLOR_BLUE, COLOR_PURPLE, // про останню кому читайте нижче }; // але сам enum повинен закінчуватися крапкою з комою // Визначаємо декілька змінних перелічуваного типу Colors Colors paint = COLOR_RED; Colors house(COLOR_GRAY); Оголошення перерахувань не вимагає виділення пам’яті. Тільки коли змінна перелічуваного типу визначена (наприклад, як змінна paint у вищенаведеному прикладі), тільки тоді виділяється пам’ять для цієї змінної. Зверніть увагу, кожен енумератор розділяється комою, а саме перерахування закінчується крапкою з комою. Примітка: До C++11, кінцева кома після останнього елементу (як після COLOR_PURPLE у вищенаведеному прикладі) була заборонена (хоча не всі компілятори на це звертали увагу). Однак починаючи з C++11 кінцева кома дозволена. Імена перерахувань Імена перерахувань часто починаються з великої літери, а імена елементів взагалі складаються тільки з великих букв. Оскільки елементи знаходяться в одному і тому ж просторі імен, що і саме перерахування, то одне і те ж ім’я одного енумератора не може бути використано в кількох перерахувань одного і того ж простору імен: enum Colors { YELLOW, BLACK, // BLACK знаходиться в глобальному просторі імен PINK }; enum Feelings { SAD, ANGRY, BLACK // отримаємо помилку, так як BLACK вже використовується в enum Colors }; Також поширено додання назви перерахування в якості префіксу до його елементів, наприклад: ANIMAL_ чи COLOR_, як для запобігання конфліктів імен, так і з метою коментування коду. Значення енумераторів Кожному енумератору автоматично присвоюється цілочисельне значення в залежності від його позиції в списку перерахування. За замовчуванням, першому елементу присвоюється ціле число 0, а кожному наступному — на одиницю більше, ніж попередньому: #include enum Colors { COLOR_YELLOW, // присвоюється 0 COLOR_WHITE, // присвоюється 1 COLOR_ORANGE, // присвоюється 2 COLOR_GREEN, // присвоюється 3 COLOR_RED, // присвоюється 4 COLOR_GRAY, // присвоюється 5 COLOR_PURPLE, // присвоюється 6 COLOR_BROWN // присвоюється 7 }; int main() { Colors paint(COLOR_RED); std::cout color; // викличе помилку компіляції return 0; } Однак, ви можете ввести ціле число, а потім використати оператор static_cast, щоб помістити цілочисельне значення в перелічуваний тип: int inputColor; std::cin >> inputColor; Colors color = static_cast(inputColor); Кожен перелічуваний тип вважається окремим типом, тому спроба присвоїти енумератор з одного перерахування енумератору з іншого — викличе помилку компіляції: Animals animal = COLOR_BLUE; // викличе помилку компіляції Як і у випадку з константами, перерахування відображаються у відлагоджувачеві, що робить їх ще більш корисними. Вивід енумераторів Спроба вивести енумератор за допомогою std::cout призведе до виводу цілочисельного значення самого енумератора (тобто його порядкового номера). Але як вивести значення енумератора у вигляді тексту? Один із способів — написати функцію з використанням if-стейтментів: enum Colors { COLOR_PURPLE, // присвоюється 0 COLOR_GRAY, // присвоюється 1 COLOR_BLUE, // присвоюється 2 COLOR_GREEN, // присвоюється 3 COLOR_BROWN, // присвоюється 4 COLOR_PINK, // присвоюється 5 COLOR_YELLOW, // присвоюється 6 COLOR_MAGENTA // присвоюється 7 }; void printColor(Colors color) { if (color == COLOR_PURPLE) std::cout