ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 4) онлайн

Дни недели

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

// dayenum.cpp

// применение перечислений

#include <iostream>

using namespace std;

// объявление перечисляемого типа

enum days_of_week { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

int main()

{

  days_of_week day1, day2;     // определения переменных,

                               // хранящих дни недели

  day1 = Mon;                  // инициализация переменных

  day2 = Thu;

  int diff = day2 - day1;      // арифметическая операция

  cout << "Разница в днях: " << diff << endl;

  if( day1 < day2)             // сравнение

  cout << "day1 наступит раньше, чем day2\n";

  return 0;

}

Объявление типа начинается со слова enum и содержит перечисление всех возможных значений переменных создаваемого типа. Эти значения называются константами перечисляемою типа. Перечисляемый тип days_of_week включает 7 констант перечисляемого типа: Sun, Mon, Tue и т. д. до Sat. На рис. 4.8 приведен синтаксис объявления перечисляемого типа.

Рис. 4.8. Синтаксис спецификатора enum

Итак, перечисление представляет собой список всех возможных значений. В этом отношении тип int отличается от перечислений, поскольку он задается

тип enum

Небольшое число значений поименовано, и обращение к ним происходит по именам

тип int

Когда значений много, они не именуются; обращение по значениям

 

Рис. 4.9. Использование типов int и enum

 

Когда тип days_of_week определен, можно определять и переменные этого ти- па. В программе DAYENUM мы используем две переменные типа days_of_week:

days_of_week day1, day2;

В языке C в подобных объявлениях было необходимо использовать ключе- вое слово enum:

enum days_of_week day1, day2;

но язык C++ устранил эту необходимость.

Переменным перечисляемого типа можно присваивать любое из значений, указанных при объявлении типа. Например, переменным day1 и day2 из нашей последней программы мы присваиваем значения Mon и Thu. Присваивание зна- чений, не указанных при перечислении, например

day1 = halloween;

не допускается.

Перечисляемые типы данных допускают применение основных арифметиче- ских операций. В частности, в нашей программе производится вычитание двух пе- ременных перечисляемого типа. Кроме того, перечисляемые типы допускают

с помощью диапазона значений. Используя перечисления, необходимо давать имя каждому возможному значению создаваемого типа. Различие между типом int и перечисляемыми типами проиллюстрировано на рис. 4.9.

применение операции сравнения, что также используется в нашем примере. Результат работы программы DAYENUM выглядит следующим образом:

Разница в днях: 3

day1 наступит раньше, чем day2

Использование арифметических операций и операций отношения с перечис- ляемыми типами данных, как правило, не несет большой смысловой нагрузки. Например, если мы определили тип данных pets, хранящий названия домашних животных, следующим образом:

enum pets { cat, dog, hamster, canary, ocelot };

то неясен смысл выражений dog + canary или (cat < hamster) и т.п.

Внутренне перечисляемые типы данных представляются и обрабатываются как целые числа. Этот факт объясняет возможность применения к переменным перечисляемого типа арифметических операций и операций отношения. Фак- тически первое значение в списке рассматривается как число 0, второе — как число 1, и т. д. В программе DAYENUM значения от Sun до Sat представляют собой целые числа в диапазоне 0...6.

Арифметические операции над переменными перечисляемых типов сводятся к операциям над целыми числами. Однако, несмотря на то, что компилятор зна- ет о целочисленной форме представления перечисляемых значений, стоит ис- пользовать этот факт с большой осторожностью. Если вы попробуете выпол- нить присваивание

day1 = 5;

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

 

14