Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ Страуструп.doc
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
2.72 Mб
Скачать

2.5.1. Перечисления

Есть способ связывания имен с целыми константами, который часто более

удобен, чем описание с const. Например:

enum { ASM, AUTO, BREAK };

Здесь определены три целых константы, которые называются элементами

перечисления, и им присвоены значения. Поскольку по умолчанию значения

элементов перечисления начинаются с 0 и идут в возрастающем порядке,

то приведенное перечисление эквивалентно определениям:

const ASM = 0;

const AUTO = 1;

const BREAK = 2;

Перечисление может иметь имя, например:

enum keyword { ASM, AUTO, BREAK };

Имя перечисления становится новым типом. С помощью стандартных

преобразований тип перечисления может неявно приводиться к типу int.

Обратное преобразование (из типа int в перечисление) должно быть задано

явно. Например:

void f()

{

keyword k = ASM;

int i = ASM;

k = i // ошибка

k = keyword(i);

i = k;

k = 4; // ошибка

}

Последнее преобразование поясняет, почему нет неявного преобразования

из int в перечисление: большинство значений типа int не имеет

представления в данном перечислении.

Описав переменную с типом keyword вместо очевидного int, мы дали

как пользователю, так и транслятору определенную информацию о том,

как будет использоваться эта переменная. Например, для следующего

оператора

keyword key;

switch (key) {

case ASM:

// выполнить что-либо

break;

case BREAK:

// выполнить что-либо

break;

}

транслятор может выдать предупреждение, поскольку из трех возможных

значений типа keyword используются только два.

Значения элементов перечисления можно задавать и явно. Например:

enum int16 {

sign=0100000,

most_significant=040000,

least_significant=1

};

Задаваемые значения необязательно должны быть различными, положительными

и идти в возрастающем порядке.

2.6. Экономия памяти

В процессе создания нетривиальной программы рано или поздно наступает

момент, когда требуется больше памяти, чем можно выделить или

запросить. Есть два способа выжать еще некоторое количество памяти:

[1] паковать в байты переменные с малыми значениями;

[2] использовать одну и ту же память для хранения разных объектов

в разное время.

Первый способ реализуется с помощью полей, а второй - с помощью

объединений. И те, и другие описываются ниже. Поскольку назначение

этих конструкций связано в основном с оптимизацией программы, и

поскольку, как правило, они непереносимы, программисту следует

хорошенько подумать, прежде чем использовать их. Часто лучше изменить

алгоритм работы с данными, например, больше использовать динамически

выделяемую память, чем заранее отведенную статическую память.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]