ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4257
Скачиваний: 28
Глава 8. Типы данных, определяемые программистом
101
В языке программирования C++ новые типы данных могут объяв-
ляться в любом месте программы.
Область видимости типов данных, определяемых программи-
стом, подчиняется тем же правилам, что и имена переменных.
В заключение этого введения скажем, что так новые типы данных
определяются программистом, то они часто называются
пользо-
вательскими
типами данных, где под пользователем подразуме-
вается программист.
8.2. Перечисления
Перечислением
называется тип данных, который включает набор
именованных целочисленных констант. Элементы перечисления
называются
членами перечисления
или
перечислимыми
констан-
тами. Объявляются перечисления следующим образом:
enum [имя_перечисления] {список_значений};
Здесь
enum
— ключевое слово,
имя_перечисления
служит для име-
нования типа перечисления и называется
тегом
перечисления
, а
список_значений
перечисляет именованные целочисленные кон-
станты, принадлежащие перечислению. При объявлении пере-
числения его элементы могут инициализироваться. Например,
перечисление может быть объявлено как:
enum color {r = 2, g = 4, b = 6}; /* объявление типа */
По умолчанию перечислимым константам присваиваются после-
довательные значения, начиная с нуля. Например:
enum color {r, g, b}; /* r = 0, g = 1, b = 2 */
Если, начиная с некоторой перечислимой константы, инициали-
зация прекращается, то следующей перечислимой константе при-
сваивается значение на единицу большее, чем значение преды-
дущей перечислимой константы. Например:
enum color {r, g = 3, b}; /* r = 0, g = 3, b = 4 */
Часть I. Язык программирования С
102
Допускается объявление перечислений, не имеющих имени. Та-
кие перечисления называются
анонимными
. Например:
enum {off, on}; /* анонимное перечисление */
Анонимные перечисления используются просто для определения
именованных целочисленных констант.
Тип перечисления определяется ключевым словом
enum
и тегом
перечисления. Поэтому переменная типа "перечисление" объяв-
ляется следующим образом:
enum имя_перечисления имя_переменной;
Например:
enum color c; /* с – переменная типа enum color */
В языке программирования C++ тип перечисления может опреде-
ляться только именем перечисления.
Учитывая это замечание, в языке программирования C++ пере-
менную типа "перечисление" можно объявить следующим образом:
color d; // d – переменная типа color
Объявление типа перечисления и переменной, которая имеет этот
тип, может быть объединено в одну инструкцию. Например:
enum light {off, on} t; /* t – имя переменной */
Допускается объявление переменных, которые имеют тип ано-
нимного перечисления. Например:
enum {off, on} t;
Переменной типа перечисления можно присваивать только зна-
чения, принадлежащие ее типу. Эти значения могут присваивать-
ся переменной, используя как имена перечислимых констант, так
и целочисленные значения. Например:
color c = g;
color c = 2;
Глава 8. Типы данных, определяемые программистом
103
В языке программирования С++ переменным типа перечисления
можно присваивать значения, используя только имена перечис-
лимых констант.
Учитывая это замечание, следующая инструкция:
color c = 0;
вызовет ошибку в языке программирования С++.
Целочисленным переменным можно присваивать значения пере-
числимых констант. Например:
int e = r;
8.3. Структуры
Структурой
называется упорядоченное множество данных, ко-
торые называются
полями
или
членами структуры
. Поля струк-
туры могут иметь любой тип, исключая типы
void
и функцию.
При этом следует учитывать, что структура может содержать
только такие поля, длина которых известна компилятору в мо-
мент определения структуры.
Структурным типом данных
или
просто
структурой
называется тип, описывающий структуру.
Объявляется структурный тип следующим образом:
struct [имя_структуры]
{
/* объявления членов структуры */
};
Здесь
struct
— ключевое слово, а
имя_структуры
служит для име-
нования структурного типа и называется
тегом
структуры
, а
члены структуры перечисляются в блоке. Особенно следует обра-
тить внимание на то, что объявление структуры должно заканчи-
ваться символом
;
. Например:
struct emp
{
int empno;
Часть I. Язык программирования С
104
char name[20];
double salary;
};
Допускается объявление структур, не имеющих имени. Такие
структуры называются
анонимными
. Например:
struct {double x, y;}; /* анонимная структура */
Тип структуры определяется ключевым словом
struct
и тегом
структуры. Поэтому переменная структурного типа объявляется
следующим образом:
struct имя_структуры имя_переменной;
Например:
struct emp e; /* e – переменная типа struct emp */
В языке программирования С++ тип структуры также определяет-
ся только именем структуры.
Учитывая это замечание, в языке программирования С++ пере-
менную структурного типа можно также объявить следующим
образом:
emp d; // d – переменная типа emp
Объявление структурного типа и переменной, которая имеет этот
тип, может быть объединено в одну инструкцию. Например:
struct emp
{
int empno;
char name[20];
double salary;
} director; /* director – имя переменной */
Допускается объявление переменных, которые имеют тип ано-
нимной структуры. Например:
struct {double x, y;} vect;
Обычно переменные структурного типа также называются
структурами
.
Глава 8. Типы данных, определяемые программистом
105
Инициализируются структуры так же, как и массивы. Например:
struct emp a = {10, "Paul", 2000};
Так как члены структуры описываются в блоке, то их имена при-
надлежат локальной области видимости внутри этого блока. Для
доступа к элементу структуры используется
оператор
.
(точка)
,
который имеет следующий вид:
переменная.имя_поля
где переменная должна иметь структурный тип. Например:
director.empno = 20;
strcpy(director.name, "John"); /* копирование строки */
director.salary = 3000;
Здесь
strcpy
стандартная функция для копирования строк, кото-
рая описана в
разд. 29.2
.
Оператор
.
(точка) возвращает L-value, имеет ассоциативность
слева направо и его приоритет совпадает с приоритетом пост-
фиксных операций инкремента и декремента.
Элементами структуры могут быть массивы и другие структуры.
Отсюда следует, что допускается вложенность структур. Для дос-
тупа к членам вложенной структуры оператор
.
(точка)
использу-
ется столько раз, какова вложенность структуры. Область види-
мости имени вложенной структуры совпадает с областью види-
мости внешней структуры.
В языке программирования С++ область видимости вложенной
структуры ограничивается блоком, в котором эта структура объяв-
лена.
В листинге 8.1 показан пример обращения к членам вложенной
структуры.
Листинг 8.1. Пример вложенных структур
#include <stdio.h>
struct demo