
Тема 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; // очень маленькое целое
};
После идентификатора битового поля следует двоеточие, а за ним – константное выражение, задающее число битов. Битовые поля, определенные в теле структуры подряд, по возможности упаковываются в соседние биты одного целого числа, делая хранение объекта более компактным. Доступ к битовому полю осуществляется так же, как к прочим элементам структуры. Аналогично можно использовать битовые поля при описании классов.