Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tema_9.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
145.92 Кб
Скачать

Тема 9

Типы данных, определяемые пользователем

1 Перечисления

Тип перечисление (enumeration) определяет множество целых констант - элементов перечисления. Перечисление описывается служебным словом enum и разделенным запятыми списком элементов перечисления. Этот список заключен в фигурные скобки. По умолчанию первому элементу присваивается значение 0, а каждому последующему - на единицу больше, чем значение предыдущего элемента.

Различают именованные и неименованные перечисления. Неименованные перечисления связывают некоторый список констант со значениями:

enum { red, green, blue };

Значение может явно присваиваться элементу перечисления. Если каким-то из элементов значение присваивается, а каким-то нет, то значение тех элементов, которым присваивания не было, на единицу больше предыдущего:

enum { red = 1, green, blue }; // green == 2, blue == 3

Именованные перечисления задают уникальный целочисленный тип и могут использоваться как спецификация типа для определения переменных.

enum Colors { red, green, blue };

Colors c = blue;

Присвоение переменной с целых значений (0, 1 или 2) приводит к появлению ошибки компиляции (в Visual C++) или предупреждения (в C++Builder).

Для перечисления, как и для всех типов, определяемых пользователем, можно перегружать операции, такие как ++ и --. Допустим, имеется тип перечисления:

enum DayOfWeek { Sunday, Monday, Tuesday, Wednesday,

Thursday, Friday, Saturday };

Для перегрузки префиксной операции ++ в том же пространстве имен, где определен тип DayOfWeek, должна быть реализована функция.

DayOfWeek& operator++(DayOfWeek& d)

{

switch (d)

{

case Sunday: d = Monday; break;

case Monday: d = Tuesday; break;

case Tuesday: d = Wednesday; break;

case Wednesday: d = Thursday; break;

case Thursday: d = Friday; break;

case Friday: d = Saturday; break;

case Saturday: d = Sunday;

}

return d;

}

Для перегрузки постфиксной операции ++ необходимо реализовать функцию, объявление которой имеет следующий вид:

DayOfWeek operator++(DayOfWeek& d, int);

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

2 Структуры

В С - это структурированный тип данных, набор элементов различных типов. В С++ структура аналогична классу, может иметь функции-элементы, однако по умолчанию элементы структуры доступны как public. Традиционно структура не используется для создания абстрактного типа. Для этих целей используются классы.

Можно сразу при объявлении типа структуры определить и переменную такого типа. Идентификатор переменной при этом нужно поместить между закрывающей фигурной скобкой и точкой с запятой.

struct Country

{

char name [20];

double area;

long population;

} France; // переменная France типа Country

В отличие от массивов, в операции присваивания структуре другой структуры того же типа происходит поэлементное копирование.

Country someCountry;

someCountry = France; // Поэлементное копирование

Обращение к конкретным элементам структуры происходит с помощью оператора "." (точка).

cout << someCountry.area;

К объектам структуры часто обращаются через указатели, используя оператор -> (разыменование указателя на структуру). Если p - это указатель, то p->m эквивалентно (*p).m.

По умолчанию параметры типа структуры передаются по значению. Для экономии памяти и увеличения быстродействия целесообразно использовать параметры типов ссылок или ссылок на константный объект. Следующая функция вычисляет плотность населения:

double density(const Country& c)

{

return c.population / c.area;

}

Для хранения заданного числа битов можно объявить член структуры специального вида, называемый битовым полем. Он должен иметь целый тип данных, со знаком или без знака:

struct Flags

{

unsigned int logical : 1; // битовое поле

unsigned int tinyInt : 3; // очень маленькое целое

};

После идентификатора битового поля следует двоеточие, а за ним – константное выражение, задающее число битов. Битовые поля, определенные в теле структуры подряд, по возможности упаковываются в соседние биты одного целого числа, делая хранение объекта более компактным. Доступ к битовому полю осуществляется так же, как к прочим элементам структуры. Аналогично можно использовать битовые поля при описании классов.

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