Данные, определяемые программистом в С++
Переименование типов (typedef)
Для удобства и понятности программы, можно задать типу новое имя с помощью ключевого слова typedef:
Примеры:
Переопределение
Использование вместо стандартных:
Перечисления - enum
Можно определить несколько именованных констант, для которых требуется, чтобы все они имели различные значения (при этом конкретные значения могут быть не важны).
Для этого удобно воспользоваться перечисляемым типом данных, все возможные значения которого задаются списком целочисленных констант.
Формат:
Пример.
Константами ERR_READ, ERR_WRITE, ERR_CONVERT получены значения 0, 1, 2
Пример:
Константам three и four присваиваются значения 3 и 4, константе eleven — 11.
Имена перечисляемых констант должны быть уникальными, а значения могут совпадать.
Преимущество описания в наглядности; кроме того, компилятор при инициализации констант может выполнять проверку типов.
При выполнении арифметических операций перечисления преобразуются в целые.
Структуры (struct) - аналог записей в Паскале
В отличие от массива, все элементы которого однотипны, структура может со держать элементы разных типов. В языке C++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке С:
Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него.
Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка:
Пример. Определение массива структур и указателя на структуру:
Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами.
Пример.
Имя структуры можно использовать сразу после его объявления (определение можно дать позднее) в тех случаях, когда компилятору не требуется знать размер структуры, например:
Это позволяет создавать связные списки структур.
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:
При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива (учитывая, что многомерный массив — это массив массивов):
Важно:
1) Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование.
2) Структуру можно передавать в функцию и возвращать в качестве значения функции.
Доступ к полям структуры выполняется с помощью операций выбора . (точка) при обращении к полю через имя структуры и -> при обращении через указатель.
Пример:
* Если элемент структуры - другая структура, то доступ к элементам через две операции выбора (две точки):
Для удобства и понятности программы, можно задать типу новое имя с помощью ключевого слова typedef:
typedef тип новое_имя [ размерность ] ;Квадратные скобки - элементом синтаксиса. Размерность может отсутствовать.
Примеры:
Переопределение
typedef unsigned int UINT: typedef char Msg[100]; typedef struct{ char fio[30]; int date, code; double salary;} Worker;
UINT i , j ; // переменные типа unsigned int Msg str[10]; // массив из 10 строк по 100 символов Worker staff[100]; // массив из 100 структур
Можно определить несколько именованных констант, для которых требуется, чтобы все они имели различные значения (при этом конкретные значения могут быть не важны).
Для этого удобно воспользоваться перечисляемым типом данных, все возможные значения которого задаются списком целочисленных констант.
Формат:
enum [ имя_типа ] { список_констант };Имя типа задается в том случае, если в программе требуется определять переменные этого типа. Компилятор обеспечивает, чтобы эти переменные принимали значения только из списка констант. Константы должны быть целочисленными и могут инициализироваться обычным образом. При отсутствии инициализатора первая константа обнуляется, а каждой следующей присваивается на единицу большее значение, чем предыдущей:
Пример.
enum Err {ERR__READ. ERR__WRITE. ERR_CONVERT}; Err error; …… switch (error){ case ERR_READ; / * операторы */ break; case ERR_WRITE; / * операторы */ break; case ERR_CONVERT; / * операторы */ break; }
Пример:
enum {two = 2, three, four, ten = 10, eleven, fifty = ten + 40};
Имена перечисляемых констант должны быть уникальными, а значения могут совпадать.
Преимущество описания в наглядности; кроме того, компилятор при инициализации констант может выполнять проверку типов.
При выполнении арифметических операций перечисления преобразуются в целые.
Структуры (struct) - аналог записей в Паскале
В отличие от массива, все элементы которого однотипны, структура может со держать элементы разных типов. В языке C++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке С:
struct [имя_типа] { тип_1 элемент_1; тип_2 элемент_2; тип_n элемент_n; } [список_описателей];
Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка:
Пример. Определение массива структур и указателя на структуру:
struct { char fio[30]: int date, code; double salary; }staff[100], *ps;
Пример.
struct Worker{ //описание нового типа Worker char fio[30]; int date,code; double salary; };//описание заканчивается точкой с запятой Worker staff[100],*ps; //Определение массива типа Worker и указателя
struct List; //объявление структуры List struct Link{ List *p; //указатель на структуру List Link *prev, *succ; // указатели на структуру Link }; struct List {/*определение структуры List */};
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:
struct{ char fio[30]; int date, code; double salary; }worker = {"Ляшенко", 31, 215, 3400.55};
struct complex{ float real, im; } compl [2][3] = { {{1,1}, {1,1}, {1,1}}, //строка 1 - массив compl[0] {{2,2}, {2,2}, {2,2}} //строка 2 - массив compl[1] ,..};
1) Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование.
2) Структуру можно передавать в функцию и возвращать в качестве значения функции.
Доступ к полям структуры выполняется с помощью операций выбора . (точка) при обращении к полю через имя структуры и -> при обращении через указатель.
Пример:
Worker worker, staff[100], *ps; ... worker.fio = "Ляшенко"; staff[8].code = 215; ps->salary = 0.12;
struct А {int а; double х;}; struct В {А а; double х;} х[2]; х[0].а.а = 1; х[1].х = 0.1;