 |
private.
3. Объединения инициализируются через компонент, объяв-
ленный первым
union local87 (*
int i;
double d;
*) a = (* 20*);
4. С++ : Объединение не может участвовать в иерархии
класса. Оно не может являться производным от какого-либо
класса или быть базовым классом. Объединение может иметь
конструктор.
5. С++ : Анонимные объединения не могут иметь компонен-
ты-функции.
Перечислимые данные
Тип перечислимых данных служит для обеспечения мнемони-
ческих идентификаторов набора целочисленных значений. Напри-
мер, следующее объявление:
enum days (* sun, mon, tues, wed, thur, fri, sat *)
anyday;
устанавливает уникальный интегральный тип, enum days,
переменную anyday этого типа и набор нумераторов
(sun,mon,...), которым соответствуют целочисленные констан-
ты.
Turbo C++ может хранить нумераторы в одном байте, если
это позволяет диапазон значений нумераторов, когда выключена
опция -b (по умолчанию она включена; это означает, что дан-
ные типа enum всегда int), но при использовании их в выраже-
ниях выполняется этих данных преобразования к типу int.
Идентификаторы, используемые в списке нумераторов, неявно
получают тип unsigned char или int, в зависимости от значе-
ний нумераторов. Если все значения могут быть представлены
типом unsigned char, то это и будет типом каждого нумерато-
ра.
C++ В С переменной перечислимого типа может быть прис-
воено любое значение типа int - кроме этого, никакого конт-
роля типа не выполняется. В С++ переменной перечислимого
типа может присваиваться только значение одного из ее нуме-
раторов. Таким образом,
anyday = mon; // так можно
anyday = 1; // так нельзя, даже хотя mon == 1
Идентификатор days является опциональным тегом перечис-
лимого типа,который можно использовать в последующих объяв-
лениях переменных перечислимого типа enum days:
enum days payday, holiday; // объявление двух переменных
С++ В С++ ключевое слово enum можно опустить, если в
пределах данного контекста имя days не дублируется.
Как и в случае объявлений struct и union, если далее
переменные данного типа enum не требуются, тег может быть
опущен:
- 70 -
enum (* sun, mon, tues, wed, thur, fri, sat *) anyday;
/* анонимный тип enum */
Подробное описание констант перечислимого типа см. на
стр. 17 оригинала.
Нумераторы, перечисленные внутри фигурных скобок, назы-
ваются перечислимыми константами. Каждой из них назначается
фиксированное целочисленное значение. При отсутствии явно
заданных инициализаторов первый нумератор (sun) устанавлива-
ется в ноль, а каждый последующий нумератор имеет значение
на единицу больше, чем предыдущий (mon = 1, tue = 2 и т.д.).
При наличии явных интегральных инициализаторов вы може-
те установить один или более нумераторов в конкретные значе-
ния. Любые последующие имена без инициализаторов будут
получать приращение в единицу. Например, в следующем объяв-
лении
/* выражение инициализатора может включать в себя нуме-
раторы, объявленные ранее */
enum coins (* penny = 1, tuppence, nickel = penny + 4,
dime =10, quarter = nickel * nickel *) smallchange;
tuppence примет значение 2, nickel - значение 5, а
quarter - значение 25.
Инициализатор может быть любым выражением, дающим поло-
жительное или отрицательное целочисленное значение (после,
возможно, некоторых целочисленных преобразований.) Обычно
такие значения бывают уникальными, но дублирование их также
не запрещено.
Тип enum может участвовать во всех конструкциях,допус-
кающих использование типов int.
enum days (* sun, mon, tues, wed, thur, fri, sat *) anyday;
enum days payday;
typedef enum days DAYS;
DAYS *daysptr;
int i = tues;
anyday = mon; // так можно
*daysptr = anyday; // так можно
mon = tues; // неверно: mon - это константа
Теги перечислимых типов разделяют пространство имен с
тегами структур и объединений. Нумераторы разделяют прост-
ранство имен с обычными идентификаторами переменных:
int mon = 11;
(*
enum days (* sun, mon, tues, wed, thur, fri, sat *) anyday;
/* нумератор mon скрывает внешнее объявление int mon */
struct days (* int i, j;); // неверно: дублируется тег days
double sat; // неверно: переопределение sat
*)
mon = 12; // снова в контексте int mon
C++ В С++ нумераторы, объявленные в пределах клас-
са,имеют контекст этого класса.
Выражения
В таблице 1.19 показано, каким образом комбинируются
идентификаторы и операции для составления грамматически вер-
ных "фраз".
- 71 -
Выражением называется последовательность операций, опе-
рандов и пунктуаторов, задающих определенное вычисление.
Формальный синтаксис, показанный в таблице 1.19, обозначает,
что выражения определяются рекурсивно: под-выражения могут
быть вложены без формальных ограничений. (Однако, если ком-
пилятор не сможет обработать какое-либо слишком сложное вы-
ражение, то будет выдано сообщение об ошибке).
Выражения Turbo C++ Таблица 1.19
-----------------------------------------------------------
первичное-выражение:
литерал
псевдо-переменная
(выражение)
this (только С++)
:: идентификатор (только С++)
:: имя-функции-операции (только С++)
имя
литерал:
целочисленная-константа
символьная-константа
константа-с-плавающей-точкой
строка
имя:
идентификатор:
имя-функции-операции (только С++)
имя-функции-преобразования (только С++)
квалифицированное-имя (только С++)
квалифицированное-имя: (только С++)
имя-класса :: идентификатор
имя-класса :: имя-функции-операции
имя-класса :: имя-функции-преобразования
имя-класса :: имя-класса
имя-класса :: - имя-класса
постфиксное-выражение:
первичное-выражение
постфиксное-выражение[выражение]
постфиксное-выражение (<список-выражений>)
постфиксное-выражение (<список-выражений>) (только С++)
постфиксное-выражение . имя постфиксное-выражение -> имя
постфиксное-выражение ++ постфиксное-выражение --
список-выражений:
выражение-присваивания
список-выражений , выражение-присваивания
унарное-выражение:
постфиксное-выражение
++ унарное-выражение
-- унарное-выражение
унарная-операция выражение-приведения
sizeof унарное-выражение
sizeof (имя-типа)
выражение-распределения (только С++)
выражение-отмены-распределения (только С++)
унарная-операция: одно из
& * + - тильда !
выражение-распределения: (только С++)
<::> new <местоположение> имя-ограниченного-типа <ини-
|