15.3 Операторы присваивания |
Вверх Предыдущий Следующий |
Оператор присваивания определяет действие присвоения переменной одного типа другой (переменной). Тип результата должен совпадать с типом переменной в левой части оператора присваивания, единственный параметр оператора присваивания должен иметь тот же тип, что и выражение справа от оператора присваивания. Эта система может быть использована, чтобы объявить новый тип, и определить присвоение для этого типа. Например, чтобы иметь возможность присваивать вновь определенный тип 'Complex' Var C,Z : Complex; // Определённый ранее тип complex begin Z:=C; // присвоение одной переменной типа complex другой. end; Должен быть определен следующий оператор присваивания: Operator := (C : Complex) z : complex; Для того, чтобы присвоить тип real сложному типу (complex) можно действовать следующим образом: var R : real; C : complex; begin C:=R; end; Должен быть определен следующий оператор присваивания: Operator := (r : real) z : complex; Таким образом определяется оператор присваивания (:=) с переменной типа real в правой части (аргумент оператора) и complex в левой части (результат оператора) выражения. Пример реализации может быть следующим: operator := (r : real) z : complex; begin z.re:=r; z.im:=0.0; end; В данном примере, идентификатор результата (z) используется для хранения результата выполнения операции. При компиляции в режимах Delphi или ObjFPC, допускается использование идентификатора Result, или может быть заменен на Z (как идентификатор результата), эти два подхода эквивалентны (как показано выше). operator := (r : real) z : complex; begin Result.re:=r; Result.im:=0.0; end; Оператор присваивания используется и для преобразования типов (из одного типа в другой). Компилятор будет просматривать все перегружена операторы присваивания, пока не найдёт соответствия типов с левой и правой стороны выражения. Если такой оператор не найден, генерируется ошибка 'несоответствие типов' ('type mismatch').
Учитывая следующие определения: uses sysutils;
type TTest1 = record f: LongInt; end; TTest2 = record f: String; end; TTest3 = record f: Boolean; end; Можно создать операторы присваивания: operator := (aRight: TTest1) Res: TTest2; begin Writeln('Неявное TTest1 => TTest2'); Res.f := IntToStr(aRight.f); end;
operator := (aRight: TTest1) Res: TTest3; begin Writeln('Неявное TTest1 => TTest3'); Res.f := aRight.f <> 0; end; Но можно также определить тип оператора: operator Explicit(aRight: TTest2) Res: TTest1; begin Writeln('Явное TTest2 => TTest1'); Res.f := StrToIntDef(aRight.f, 0); end;
operator Explicit(aRight: TTest1) Res: TTest3; begin Writeln('Явное TTest1 => TTest3'); Res.f := aRight.f <> 0; end; Таким образом, следующий код var t1: TTest1; t2: TTest2; t3: TTest3; begin t1.f := 42; // Неявное t2 := t1; // теоретически явная, но будет использоваться неявная операция, // потому что никакого явного оператора не определено t2 := TTest2(t1); // следующий код не будет компилировать, // т.к. не определён ни один оператор присваивания //(явное присваивание здесь использоваться не будет) //t1 := t2; // Явное t1 := TTest1(t2); // Первое преобразование явное (TTest2 => TTest1), // следующее преобразование неявное (TTest1 => TTest3) t3 := TTest1(t2); // Неявное t3 := t1; // Явное t3 := TTest3(t1); end. будет выводить: Неявное TTest1 => TTest2 |