Структура

Общее описание

Структура представляет собой тип, имеющий фиксированный набор полей и конструкторов. Каждое поле имеет тип, указанный при разработке структуры. Структура может содержать только данные и не может содержать описания методов. После описания структуры, ее можно использовать в программах наряду с другими типами данных.

Синтаксис объявления структуры:

структура имя-структуры
    [модификатор имя-поля: тип-поля[ = значение-инициализации]]
    [модификатор имя-поля: тип-поля[ = значение-инициализации]]
    [модификатор имя-поля: тип-поля[ = значение-инициализации]]
    ...
    [конструктор()]
    [конструктор(имя-поля-1)]
    ...
;
имя-структуры
имя-структуры указывает имя описываемой структуры (имя типа). С помощью этого имени в дальнейшем будет происходить использование создаваемой структуры, например, создание переменной с типом структуры. Имя должно удовлетворять общим требованиям к именам в языке.
модификатор
Каждое поле структуры объявляется аналогично обычной переменной в модуле. Оно начинается с ключевого слова пер или знч, затем следует имя поля, его тип и необязательное значение инициализации. Имена полей должны соответствовать общим требованиям к именам языка.
Важно: Поле структуры не может быть описано таким образом, чтобы у него был тип самой определяемой структуры. Другими словами не допускается рекурсивное объявление типа поля.
Имена полей должны быть уникальны в рамках одной структуры.
Если описание поля структуры начинается с модификатора пер, то значение такого поля может быть изменено путем присваивания значения. Если описание поля структуры начинается с модификатора знч, то для такого поля значение может быть установлено только во время создания экземпляра структуры с помощью конструктора.
значение-инициализации
Описывает, какое значение будет принимать поле при создании экземпляра. В качестве значения инициализации может выступать любое выражение, которое вычислимо во время компиляции.
конструктор
По умолчанию, для структуры создается автоматический конструктор, который включает в себя все поля структуры в том порядке, как они описаны в самой структуре.
Конструктор задается с помощью указания ключевого слова конструктор, за которым, в круглых скобках, должны быть указаны имена полей, инициализация которых будет выполняться этим конструктором. Во всех конструкторах должны быть перечислены поля структуры, типы которых не обладают значениями по умолчанию и для которых не указаны данные инициализации. Для параметров конструктора не допускается указание значений по умолчанию. Порядок полей в конструкторе может не совпадать с порядком полей в описании структуры. Структура может иметь несколько конструкторов, которые различаются только количеством параметров.
Если при использовании структуры используется автоматический конструктор, то не рекомендуется менять порядок полей в объявлении структуры. Это приведет к изменению параметров автоматического конструктора и, как следствие, к появлению различных побочных эффектов. Например, перестанут компилироваться модули из-за несовпадения типов.

Работа со структурой

Очевидно, что первым шагом к использованию собственного типа данных является описание этого типа. Рассмотрим простой пример данных, которые может быть востребован в языке: сохранить информацию о каком-либо файле. Допустим, нам необходимо хранить о файле следующую информацию:
  • Имя файла.
  • Тип файла: исполняемый или не исполняемый.
  • Полный путь к файлу.
  • Размер файла.

Для этого создадим следующую структуру:

структура ОписаниеФайла
    пер ИмяФайла: Строка = "" // имя файла
    знч Исполняемый: Булево = Ложь // тип файла
    пер ПолныйПуть: Строка = "" // полный путь
    пер РазмерФайла: Число = 0 // размер файла
;

Если потребуется описать переменную с типом ОписаниеФайла, то сделать это можно обычным образом: пер Файл: ОписаниеФайла;. Если надо сразу инициализировать переменную некоторым значением, то это можно сделать следующим образом (на примере командного процессора ОС Windows 10 версии 1903):

структура ОписаниеФайла
    пер ИмяФайла: Строка = "" // имя файла
    знч Исполняемый: Булево = Ложь // тип файла
    пер ПолныйПуть: Строка = "" // полный путь
    пер РазмерФайла: Число = 0 // размер файла
;

метод Скрипт()
    пер КомандныйПроцессор: ОписаниеФайла = новый ОписаниеФайла("cmd.exe",
            Истина,
            "C:\\Windows\\System32\\cmd.exe",
            280064)
;
В данном примере видно, каким образом формируются данные инициализации. Данными инициализации являются значения, указанные через запятую. В примере у структуры явно не указано ни одного конструктора, поэтому используется конструктор по умолчанию. Следовательно, значения, указанные в конструкторе, будут присваиваться полям структуры в следующем порядке: значения конструктора слева направо будут присваиваться полям структуры сверху вниз:
  • Свойству ИмяФайла будет присвоена строка cmd.exe.
  • Свойству Исполняемый будет присвоено значение Ложь.
  • Свойству ПолныйПуть будет присвоена строка C:\\Windows\\System32\\cmd.exe.
  • Свойству РазмерФайла будет присвоено значение 280 064.

Стоит обратить внимание на то, что свойство Исполняемый указано с модификатором знч. А это означает, что написать выражение КомандныйПроцессор.Исполняемый = ложь уже не получится.

Очевидно, что в реальной жизни параметры файла следует заполнять, предварительно получив эти значения у файловой системы, но в примере можно пойти на некоторое упрощение и заранее получить нужные значения.

Если теперь нам необходимо получить значение какого-то поля структуры, то для этого потребуется указать имя переменной и имя поля, разделив их символом «точка» — вот так: КомандныйПроцессор.ИмяФайла вернет значение, которое находится в поле ИмяФайла переменной КомандныйПроцессор, описанной с типом структуры ОписаниеФайла. Указанное выражение может использоваться как в качестве источника — для получения значения поля, так и в качестве назначения выражения — для установки значения поля.

Кроме указанного способа значение поля структуры можно получить с помощью операции доступа по индексу []. Для этого следует в квадратных скобках после имени переменной указать имя свойства, с которым надо работать: КомандныйПроцессор["ИмяФайла"] или КомандныйПроцессор[стрИмяПоля].

Сравнение структур

Допустимо сравнение двух значений типа структура на равенство (или неравенство). Две структуры будут считаться равными, если эти структуры одного типа и значения полей попарно совпадают.