情况
我正在研究Nick Hodges的“Delphi中的更多编码”,他正在使用 TFraction
记录解释运算符重载。我自己写了这样的记录:
type
TFraction = record
strict private
aNumerator: integer;
aDenominator: integer;
function GCD(a, b: integer): integer;
public
constructor Create(aNumerator: integer; aDenominator: integer);
procedure Reduce;
class operator Add(fraction1, fraction2: TFraction): TFraction;
class operator Subtract(fraction1, fraction2: TFraction): TFraction;
//... implicit, explicit, multiply...
property Numerator: integer read aNumerator;
property Denominator: integer read aDenominator;
end;
当然,我必须创建一个构造函数,因为在Q(有理数)中我必须有一个不等于零的分母。
constructor TFraction.Create(aNumerator, aDenominator: integer);
begin
if (aDenominator = 0) then
begin
raise Exception.Create('Denominator cannot be zero in rationals!');
end;
if ( (aNumerator < 0) or (aDenominator < 0) ) then
begin
Self.aNumerator := -aNumerator;
Self.aDenominator := -aDenominator;
end
else
begin
Self.aNumerator := aNumerator;
Self.aDenominator := aDenominator;
end;
end;
问题
由于操作员超载返回a TFraction
,我将定义一个这样的操作:
class operator TFraction.Add(fraction1, fraction2: TFraction): TFraction;
var
tmp: TFraction;
begin
//simple algorithm of the sum
tmp := TFraction.Create(fraction1.Numerator*fraction2.Denominator+fraction1.Denominator*fraction2.Numerator, fraction1.Denominator*fraction2.Denominator);
tmp.Reduce;
//return the result
Result := tmp;
end;
正如你在这里看到的,我正在创造一个 tmp
从函数返回的。
当我阅读Marco Cantu的书时,他使用了另一种方法:
class operator TFraction.Add(fraction1, fraction2: TFraction): TFraction;
begin
Result.aNumerator := (fraction1.Numerator*fraction2.Denominator+fraction1.Denominator*fraction2.Numerator);
Result.aDenominator := fraction1.Denominator*fraction2.Denominator;
end;
我已经做了一些测试,我发现两者都给了我正确的结果,但有一些我无法理解的东西。在第一种方法中,我宣布 TMP 然后我调用构造函数,以便我可以返回一个 TFraction
。在第二种方法中,我没有创建任何东西,因为记录具有自动构造函数。事实上,文档说:
使用默认的无参数自动构建记录 构造函数,但必须显式构造类。因为 记录有一个默认的无参数构造函数,任何用户定义的 记录构造函数必须具有一个或多个参数。
这里我有一个用户定义的记录构造函数。所以:
是构造函数调用
tmp
第一种方法不需要?如果我想打电话Reduce
(这是一个程序),我需要创建一个变量。是个Result
只是返回一份副本tmp
没有创造什么?在第二种方法中,是
Result.aNumerator
和Result.aDenominator
自动创建的构造函数的参数?