Перегрузка операций, Компилятор FPC 2.0.x |
Перегрузка операций, Компилятор FPC 2.0.x |
volvo |
11.01.2006 15:23
Сообщение
#1
|
Гость |
Перегрузка операций
Зачем это нужно? Очень часто при работе с типами данных, определенных пользователями, не хватает возможности работать с этими типами, как со встроенными в язык, т.е., например для сложения матриц не использовать вызов процедуры MatrixAdd(C, A, B); , а записать эту операцию в виде C := A + B; Или для сравнения матрицы с нулевой (или единичной) использовать не If isEqual(mx, mxO) or isEqual(mx, mxE) , а If (mx = mxO) or (mx = mxE)... В решении этой задачи могут помочь перегруженные операции. Как это сделать? Прежде всего - чтобы перегрузка была доступна, программа (или модуль, если это делается в модуле) должна компилироваться с ключом {$mode objfpc}. При использовании модулей директива {$mode objfpc} обязательна только для модуля, содержащего реализацию перегрузки, вызывающая программа может такой директивы не иметь... Ну, и второе: для того, чтобы использовать в программе перегруженные операции, их нужно сначала определить. Это делается так: Operator {перегружаемая операция} ({список параметров}) {возвращаемое значение}; где: {перегружаемая операция} - одна из следующих:
{возвращаемое значение} - то, что вернется в вызывающую программу как результат выполнения операции. Например, при операции сложения 2-х матриц, результатом также является матрица: Operator + (Const m1, m2: TMatrix) R: TMatrix; После этого описания в программе можно делать так: Var A, B, C: TMatrix; Перегрузка функций Кроме перегрузки операций (переопределения операций для пользовательских типов) в FPC введена еще и перегрузка функций, т.е. в программе может быть несколько процедур/функций с одинаковыми именами (сюда же относятся и Operator-ы), при условии, что их списки параметров неодинаковы. Т.е. можно сделать так: function test(a: integer): integer; Эта возможность поможет, например, в таком случае. Допустим, была переопределена операция + для матриц: operator + (const mx1, mx2: TMatrix) r: TMatrix; но иногда модет понадобиться и операция сложения матрицы с числом, т.е. увеличение каждого элемента матрицы на какую-то величину. Без перегрузки функций здесь не обойтись: operator + (const mx: TMatrix; const X: integer) r: TMatrix; (параметры первой и второй Operator + различны, следовательно ошибки не будет) Теперь можно использовать как сложение матриц, так и сложение матрицы с числом: Var A, B, C: TMatrix; Внимание: перегруженные операции не являются коммутативными, если типы переменных слева и справа от знака операции различны, т.е. если можно записать A := A + 2; это совсем не значит, что можно сделать и A := 2 + A; Компилятор сразу сообщит об ошибке: "Operator is not overloaded" ("Операция не перегружена")... Для того, чтобы иметь возможность использовать оба варианта сложения матрицы с числом, придется определить еще одну операцию: operator + (const X: integer; const mx: TMatrix) r: TMatrix; Примеры использования: Здесь: Как вычислить заданный многочлен от матрицы A приведен пример вычисления заданного многочлена от матрицы A ... С использованием перегрузки операторов та же программа будет выглядеть вот так: {$mode objfpc} ********** Еще одно полезное применение перегрузки операций - операции с большими числами... Вот так это может выглядеть: vlint.pas ( 7.39 килобайт ) Кол-во скачиваний: 496 |
Текстовая версия | 27.04.2024 19:19 |