操作符 Overloading
 
改变用户定义的类型与内置运算符一起使用的方式。

概观
全球运算符
会员经营者

概观

简单来说,运算符是程序,它们的参数称为operands .使用一个操作数(操作符 Not)的运算符称为unary operators ,运算符采用两个操作数(操作符 +)称为binary operators ,运算符占用三个操作数(操作符 Iif)称为ternary operators .

大多数运算符不像程序那样调用。相反,它们的操作符被放置在它们的操作数旁边。对于一元运算符,它们的唯一操作数放在符号的右侧。对于二进制运算符,它们的操作数(称为左侧和右侧操作数)放置在运算符符号的左侧和右侧。FreeBASIC有一个三元运算符操作符 Iif,它被称为一个过程,其操作数以逗号分隔,用括号括起来。例如,以下代码调用操作符 Iif来确定指针是否有效。如果是,则调用操作符 * (Value Of)取消引用指针,如果不是,则调用操作符 / (Divide)来查找二十除以四的值。

Dim i As Integer = 420
Dim p As Integer Ptr = @i

Dim result As Integer = IIf( p, *p, CInt( 20 / 4 ) )

请注意,对操作符 Iif的调用类似于过程调用,而对操作符 * (Value Of)操作符 / (Divide)的调用不是。在这个例子中,p 操作符 * (Value Of)的操作数,20 4 分别是操作符 / (Divide)的左边和右边的操作数。

FreeBASIC中的所有运算符都预先定义为采用标准数据类型的操作数,例如IntegerSingle,但是对于用户定义的类型也可能会重载它们。也就是说,它们可以被定义为接受作为对象的操作数。有两种可以重载的运算符类型:global operators member operators .

全球运算符

全局运算符是在模块级范围(全局)中声明的。这些是- (Negate)Not (Bitwise Not)-> (访问成员指针)* (Value Of)+ (Add)- (Subtract)* (Multiply)/ (Divide)\ (Integer Divide)& (Concatenate)Mod (Modulus),{989796257 },Shr (右移)And (Bitwise And)??,Or (Bitwise Or)Xor (Bitwise Xor)Imp (Bitwise Imp)Eqv (Bitwise Eqv)^ (指数)= (Equal)<> (Not Equal)< (Less Than)> (Greater Than)<= (Less Than Or Equal)>= (Greater Than Or Equal).

声明一个自定义全局运算符类似于声明一个过程。Declare关键字与Operator关键字一起使用。操作符符号随后放置,后面是括号中逗号分隔的参数列表,表示传递给操作符的操作数。与过程不同,默认情况下运算符可能会重载,因此在声明自定义运算符时,不需要Overload关键字。运算符的至少一个参数必须是用户定义的类型(毕竟已经定义了内置类型参数的操作符)。

以下示例声明全局运算符- (Negate)+ (Multiply)以接受用户定义类型的操作数。

Type Rational
    As Integer numerator, denominator
End Type

Operator - (ByRef rhs As Rational) As Rational
    Return Type(-rhs.numerator, rhs.denominator)
End Operator

Operator * (ByRef lhs As Rational, ByRef rhs As Rational) As Rational
    Return Type(lhs.numerator * rhs.numerator, _
        lhs.denominator * rhs.denominator)
End Operator

Dim As Rational r1 = (2, 3), r2 = (3, 4)
Dim As Rational r3 = -(r1 * r2)
Print r3.numerator & "/" & r3.denominator

这里的全局运算符是为Rational 类型定义的,并在r3 的初始化表达式中使用。输出为-6/12 .

会员经营者

成员操作符在TypeClass定义之内声明,如成员程序,它们是转换和赋值运算符Let (Assign)Cast (Cast)+= (Add And Assign)-= (Subtract And Assign)*= (Multiply And Assign)/= (Divide And Assign)\= (Integer Divide And Assign)&= (Concat And Assign)Mod= (Modulus And Assign)Shl= (左移和赋值)Shr= (右移和赋值)And= (Conjunction And Assign)Or= (Inclusive Disjunction And Assign)Xor= (Exclusive Disjunction And Assign)Imp= (Implication And Assign)Eqv= (Equivalence And Assign).

当声明成员运算符时,使用DeclareOperator关键字,后跟运算符符号及其参数列表。与成员程序一样,成员运算符在TypeClass定义之外定义,符号名称的前缀为TypeClass名称。

以下示例重载用户定义类型的对象的成员运算符Cast (Cast)*= (Multiply And Assign).

Type Rational
    As Integer numerator, denominator
    
    Declare Operator Cast () As Double
    Declare Operator Cast () As String
    Declare Operator *= (ByRef rhs As Rational)
End Type

Operator Rational.cast () As Double
    Return numerator / denominator
End Operator

Operator Rational.cast () As String
    Return numerator & "/" & denominator
End Operator

Operator Rational.*= (ByRef rhs As Rational)
    numerator *= rhs.numerator
    denominator *= rhs.denominator
End Operator

Dim As Rational r1 = (2, 3), r2 = (3, 4)
r1 *= r2
Dim As Double d = r1
Print r1, d

请注意,成员运算符Cast (Cast)被声明为两次,一次转换为Double,一次转换为String.这是只有返回类型不同时才可以多次声明的操作符(或过程)。编译器基于如何使用对象(在Doubled 的初始化中调用Rational.Cast as double ),并在Print语句中使用Rational.Cast as string 来决定要调用哪个转换重载。