Руководство разработчика

Именованные ссылки на переменные

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

Синтаксис:

ПЕРЕМ& <имя ссылки> = <переменная>

Ключевое слово ПЕРЕМ с последующим символом & применяется в теле функции или метода для определения именованной ссылки на переменную. Тип данных, на который указывает ссылка, может быть любым, но должен совпадать с типом переменной , на который ссылается. Любое изменение значения содержащегося в ссылке повлечет изменение этого значения в переменной, на которую указывает ссылка.

Пример:

ВЫЧИСЛИТЬ
  ПЕРЕМ ЧИСЛО: х1 = 20
  ПЕРЕМ& х2 = х1
  СООБЩЕНИЕ(СТР(х1))//20
  СООБЩЕНИЕ(СТР(х2))//20
  х2 += 15
  СООБЩЕНИЕ(СТР(х1))//35
  СООБЩЕНИЕ(СТР(х2))//35
КОНЕЦ

Если связанное значение удаляется по ходу выполнения функции,то ссылка становится невалидной и обращение к ней генерирует ошибку времени выполнения.

Пример:

ВЫЧИСЛИТЬ
  ПЕРЕМ ЧИСЛО: м[]
  м[1] = 100
  м[2] = 200
  ПЕРЕМ& м1 = м[1]
  СБРОС(м)
  СООБЩЕНИЕ(СТР(м1)) //ошибка т.к. используется ссылка на несуществующую переменную
КОНЕЦ

В языке И++ имеется возможность присваивать ссылке на переменную некоторое значение внутри цикла. При этом на каждой итерации цикла именованная ссылка может привязывается к новой переменной.

Пример:

ВЫЧИСЛИТЬ
  ПЕРЕМ ЧИСЛО: м[]
  м[1] = 100
  м[2] = 200
  ЦИКЛ ИНДЕКС (массив = м[номер])
    ПЕРЕМ& элем = м[номер]
    ОТЛАДКА(элем)
  КОНЕЦ_ЦИКЛА
КОНЕЦ

Так же одну именованную ссылку на переменную можно вручную привязывать к другой переменной многократно внутри одной функции. Синтаксис повторной привязки не отличается от синтаксиса первичного объявления именованной ссылки. Тип именованной ссылки определяется при первичном объявлении и в дальнейшем не может быть изменен. Для объектных типов и интерфейсов тип повторно привязываемой переменной может быть не точно равен первичному типу ссылки, а быть дочерним (т.е. для типа вторично привязываемой переменной должно выполняться отношение "является" по отношению к первичному типу ссылки). При работе с иерархией типов лучше первое определение ссылки делать для базового типа с использованием явного уточненения типа.

Пример:

ВЫЧИСЛИТЬ
  ПЕРЕМ СТРОКА: имя = "Василий"
  ПЕРЕМ СТРОКА: фамилия = "Пупкин"
  ПЕРЕМ ЦЕЛОЕ: номер = 42
  
  ПЕРЕМ& стр = имя
  ОТЛАДКА(стр) // привязана к переменной "имя"

  ПЕРЕМ& стр = фамилия
  ОТЛАДКА(стр) // привязана теперь к переменной "фамилия"
  
  ПЕРЕМ& стр = номер // ошибка, несоответствие типа
  ОТЛАДКА(стр)
  
  ПЕРЕМ ФОРМА: форма
  ПЕРЕМ& ф = форма // первичный тип ссылки ФОРМА
  
  ПЕРЕМ ДИАЛОГ: диалог
  ПЕРЕМ& ф = диалог // ОК - тип переменной ДИАЛОГ (дочерний для ФОРМА)
  
  ПЕРЕМ КНОПКА: кнопка
  ПЕРЕМ РЕДАКТОР: редактор
  
  ПЕРЕМ& элем1 = кнопка // первичный тип ссылки КНОПКА
  ПЕРЕМ& элем1 = редактор // ошибка - РЕДАКТОР не дочерний тип КНОПКА
  
  ПЕРЕМ& элем2 = ЭЛЕМЕНТ(кнопка)   // первичный тип ссылки ЭЛЕМЕНТ - явно уточняем
  ПЕРЕМ& элем2 = ЭЛЕМЕНТ(редактор) // ОК - РЕДАКТОР дочерний тип ЭЛЕМЕНТ - тут уже можно не уточнять
  ПЕРЕМ& элем2 = редактор          // ОК - РЕДАКТОР дочерний тип ЭЛЕМЕНТ
КОНЕЦ

См. также: