W Pascalu przeciążenie operatora = dla klas jest niemożliwe. Dwa obiekty są równe wtedy i tylko wtedy gdy wskazują na tę samą instancję. Tego zachowania nie da się zmienić. Możesz albo przerzucić się na rekordy, albo zrobić funkcję na wzór języka C#
function complex.Equals(a:complex):boolean;
begin
Equals:=(re=a.re) and (im=a.im);
end;
Nie chcę ci spalać roboty, ale wykonujesz pracę nadmiarową, bo typ complex jest już gotowy ze wszystkimi operatorami (unit ucomplex), zrobiony nie na klasie a na rekordzie.
Być może nie jesteś świadomy jeszcze jednej rzeczy: przypisanie a:=b dla klas nie oznacza skopiowania obiektu, a jedynie referencji, np:
{$mode objfpc}
type complex=class re,im:real end;
var a,b:complex;
begin
a:=complex.create;
a.re:=5;
a.im:=10;
b:=a;
writeln(b.re,' ',b.im); // wypisuje 5 10 - ok
a.re:=9;
writeln(b.re,' ',b.im); // wypisuje 9 10, a przecież modyfikowaliśmy obiekt a!
a.free;
end.
W ogóle rekord bardziej się do tego nadaje: nie trzeba go tworzyć ani niszczyć, można przeciążać równość, a przypisanie kopiuje zmienną a nie tworzy nową referencję. Ale - jak już powiedziałem - jest to już w pakiecie:
uses ucomplex;
var z:complex;
begin
z.re:=5;
z.im:=2.5;
end.
Przeciążanie operatorów arytmetycznych dla klas wiąże się też z ryzykiem
wycieków pamięci, np: w przykładzie a:=b+c+d tworzymy nowy obiekt (nazwijmy go tmp) o wartości b+c, potem tworzymy drugi obiekt o wartości tmp+d i przypisujemy go do zmiennej a. Referencja do obiektu tmp została utracona, a ponieważ we FreePascalu obiekty nie są automatycznie niszczone, pamięć zaalokowana na ten obiekt jest stracona (zgubiona). Jest na to obejście, ale wykracza poza ten post :-)