Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
38
Добавлен:
16.04.2013
Размер:
82.43 Кб
Скачать

Реализация АТД в базовом языке

Агрегатный тип struct

Тип структуры позволяет программисту объединить компоненты в переменную с одним именем. Структура содержит индивидуально именованные компоненты, называемые членами1 (structure members). Поскольку члены структуры бывают различных типов, программист может создавать агрегаты (данных), позволяющие описывать сложные данные.

Давайте, в качестве простого примера определим структуру, описывающую игральную карту. Метки на карте, представляющие ее достоинство, называются очками (pips). Например, тройка пик имеет достоинство (значение очков) – 3, и значение масти – пики. Можно объявить тип структуры, как показано в следующем фрагменте.

enum suit {clubs, diamonds, hearts, spades}; // масти

typedef int pips; // pips является синонимом int

struct card { // карта

suit s;

pips p; // от 1 до 13 соответствует Т, 2, . . . . ., В, Д, К

};

В С++ имя структуры или теговое имя (tag name) является типом. В данном объявлении struct – это ключевое слово, card- теговое имя структуры, а переменные p и s – это члены структуры. Переменная p будет принимать значения от 1 до 13, что соответствует картам от туза до короля. Она является переменной типа pips, объявленного с помощью ключевого слова typedef и созданного как синоним int. Объявление с таким именем придает программе документированность и сводит сложные объявления к ясным идентификаторам.

Объявление struct card можно рассматривать как «чертеж»: оно создает тип card, но не фактические экземпляры. Объявление

card c1, c2;

выделяет память для идентификаторов c1 и c2 типа card. Для доступа к членам структур c1и c2 используется оператор выбора члена структуры, представляющий собой точку «.». Допустим, мы хотим присвоить c1 значение, соответствующее пятерке бубен, а c2 – дамы пик. Можно написать:

c1. p = 5;

c1. s = diamonds;

c2. p = 12;

c2. s = spades;

Конструкция вида

переменная_структуры. имя_члена

используется как переменная – точно таким же образом, как простая переменная или элемент массива. Имя члена должно быть уникальным внутри данной структуры. Поскольку член структуры всегда должен предваряться идентификатором переменной (теговым именем) структуры, никакой путаницы между членами, имеющими одинаковые имена в разных структурах, не возникает. Вот пример:

struct fruit {

char name [15];

int calories;

};

struct vegetable {

char name [15];

int calories;

};

fruit a;

vegetable b;

Сделав такие объявления, можно обращаться к a.calories и b.calories безо всякой двусмысленности.

Вообще, структура объявляется ключевым словом struct, за ним следует идентификатор (теговое имя), затем в фигурных скобках идет список объявлений членов. Теговое имя необязательно, но если оно есть, имя должно отражать суть моделируемого АТД. Когда теговое имя отсутствует, объявление структуры является безымянным и может использоваться только для немедленного (следующего сразу за объявлением безымянной структуры) объявления переменных этого типа, например:

struct {

int a, b, c;

} triples [2] = { {3, 3, 6}, {4, 5, 5} };

Оператор указателя структуры

Мы уже видели применение оператора выбора члена структуры « . » для доступа к ее членам. Этот раздел знакомит с оператором указателя структуры ->.

C++ предоставляет оператор указателя структуры -> для доступа к членам структуры посредством указателя. С клавиатуры этот оператор вводится как знак «минус», за которым следует знак «больше». Если переменной – указателю присвоен адрес структуры, то доступ к члену структуры может быть осуществлен с помощью конструкции вида:

указатель_на_структуру -> имя_члена

То же самое можно задать и так:

(*указатель_на_структуру). имя_члена

Операторы «->» и «.», также как ( ) и [ ], имеют самый высокий приоритет и выполняются слева направо. В сложных ситуациях оба способа доступа могут комбинироваться. Следующая таблица иллюстрирует их использование на простых примерах.

Объявления и присваивания

card cd, *pc = &cd;

card deck [52];

cd .p = 5;

cd .s = spades;

deck [0] = cd;

Выражение Эквивалентное выражение Значение

cd .p pc -> p 5

cd .suit pc -> suit spades

deck [0] . p deck -> p 5

(*pc) . suit pc -> suit spades

Соседние файлы в папке Тельминов (мб)