Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы на вопросы зачета по информатике.docx с...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
312.26 Кб
Скачать

1.4.3.1. Базисные знаки операций, для которых допустима перегрузка

Множество предопределенных операций, для которых допустимы перегрузки, является следующим:

- (унарный минус) + (унарный плюс) ~  ^ (унарное разыменование)  + - * / div mod & or  = # < <= > >= in  := (присваивание является специальным случаем, см. 1.4.3.4)

Заметим, что для знаков операций implements и is не допустима перегрузка (См. 1.9.1).   

1.4.3.2. Объявления новых знаков операций

Перегруженные операции вводятся как объявления знаков операций. Синтаксис объявления имеет следующий вид:

OperatorDeclaration = operator [ OpModifiers ] OpSymbol [ FormalParameters ] ";" OperatorBody ";".  OperatorBody = Declarations BlockStatement OpSymbol.  OpModifiers = "{" ident { "," ident } [ "," Priority ] "}".  Priority = ConstExpression.  OpSymbol = String. // 1-, 2- или 3-литерная строка; множество возможных символов ограничено

Пример:

operator '+' (x1, x2: Complex): Complex;      var res: Complex;  begin      res.re := x1.re + x2.re;      res.im := x1.im + x2.im;      return res  end '+';

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

В определенном пользователем знаке операции для присваивания должно быть два параметра, первый из которых должен подставляться по ссылке.

Имеется возможность определять перегрузки и новые операции только в module, но не в object или definition. Причина – должна быть полная возможность статического разрешения перегрузки во время компиляции. Другая причина – ясно разделить две концепции: объекты, реализующие интерфейсы (определения) и абстрактные типы данных с ассоциированными операциями.

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

Допускается определять знаки операций в некотором модуле для расширения абстрактного типа данных. Эти знаки операций должны быть определены в терминах операций, уже определенных в модуле, где объявлен абстрактный тип данных.

Обычно, все импортируемые вхождения должны квалифицироваться именами импортируемых единиц. Это также возможно, но не требуется для знаков операций. Например, имеется два законных способа использования “новых сложений” для операндов некоторого типа T.

module M;      type T {public}= …;      operator {public}"+" ( a, b : T ) : T; begin …end "+";  end M.

object Obj;      import M;      var x, y : T;  begin      x := x + y; (* подобно обычному выражению *)      x := x M."+" y; (* полностью квалифицрованный *)  end Obj.

Процедура знака операции не может быть вызвана как обычная функция:

x := M."+"(x, y); (* не законно; должна использоваться нотация выражения *)