Типы данных. Знакомствоу с простейшими видами пользовательских типов данных. Объединение разнотипных данных под одним именем, страница 2

│                Поле_1;                  │

│                Поле_i;                   │

│                  ...                           │

│                  }    XXX,YYY ;   │

где  struct     - служебное слово-оператор, указывающее, что выполняется определение структуры;

Ярлык      - имя структуры - идентификатор, который будет обозначать новый тип данных;

Поле_i     - список внутренних переменных структуры, имеющих один тип;

XXX, YYY   - список объявляемых имен переменных типа Ярлык.

┌──────────────────────────────────────────────┐

│  Но определение структуры НЕ СОЗДАЁТ переменных её типа !!!  │

└──────────────────────────────────────────────┘

При определении структуры обязательными элементами являются:

- слово-оператор struct,

- фигурные скобки {},

- завершающий символ - ; .

Необязательными являются:

- ярлык,

- поля переменных,

- список объявляемых переменных.

Пример определения простой структуры показан в ИлК S\s01.cpp.

Определение структуры все понимают, даже  кошки.

Такие умненькие крошки, но и средь них бывают

...

*           *           *

┌─────────────────────┐                      t0000124

│  Создание объектов  │

└─────────────────────┘

Определение структуры не создаёт переменных типа имени созданной структуры.

Определение структуры лишь даёт возможность пользоваться новым типом данных.

Точно также происходило при использовании базовых типов данных. Напри мер, наличие целочисленного типа int ещё не означает наличия целочисленных переменных. Эти переменные надо было объявить.

Аналогично протекает процедура работы со структурами.

┌──────────────────────────────────────────────┐

│  Переменные, имеющие тип имени структуры, необходимо объявить.  │

└──────────────────────────────────────────────┘

При объявлении переменных пользовательских типов, этих переменных можно создавать неограниченное количество, но все они будут иметь одинаковое внутреннее содержание.

Объявление переменных пользовательских типов аналогично объявлению переменных для базовых типов данных, и выполняется следующим образом:

┌──────────────────────────────────────────────┐

│  Ярлык Имя_переменной_1, ... , Имя_переменной_N;  │

└──────────────────────────────────────────────┘

, где  Ярлык - имя структуры, данное её при опеределении структуры;

Имя_переменной_N - идентификатор имени переменной.

Например,

int x, y;     - объявление переменных базового типа;

good Sd, Pz;   - объявление переменных типа good, где good

это структура, определённая где-то ранее.

Принято говорить, что:

┌─────────────────────────────────────────────┐

│  переменная структурного типа - это ОБЪЕКТ  │

└─────────────────────────────────────────────┘

, а

┌──────────────────────────────────────────────┐

│  объявление переменной структурного типа - это СОЗДАНИЕ ОБЪЕКТА      └──────────────────────────────────────────────┘

, и мы далее будем придерживаться этой терминологии.

И только после объявления переменных, т.е. создания объектов, под них выделяется память.

На эти структурные переменные распространяются все правила видимости, применимые к переменным базовых типов.

Пообъявляем переменные, то бишь посоздаём объекты в ИлК S\s03.cpp.

Определение структуры можно производить и внутри функции, что подтверждает ИлК S\s04.cpp.

Обычно определение структур внутри функций не выполняют, т.к. описание структуры занимает одинаковый размер памяти, что вне функции, что внутри функции.

Но при задании структуры внутри функции описание структуры не будет видно в других функциях, и там нельзя будет создавать объекты подобного типа.

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

Если определение структуры выполнено вне функции, то имеется возможность объявить ГЛОБАЛЬНЫЕ переменные пользовательских типов. Подобное создание глобальных объектов имеет неоспоримым достоинством возможность работы с объектом в любой функции кода без передачи его в качестве параметра.