ZetCode

FreeBasic 运算符关键字

最后修改日期:2025 年 6 月 16 日

FreeBasic 的 Operator 关键字支持用户定义类型的运算符重载。它允许为自定义类型的标准运算符定义自定义行为。

基本定义

运算符重载允许您定义运算符与自定义类型的行为方式。FreeBasic 支持重载大多数运算符,包括算术、比较和赋值运算符。

Operator 关键字用于创建运算符过程,这些过程指定运算符与自定义类型一起使用时的行为。这使得代码更直观、更易读。

重载 + 运算符

此示例显示了如何为自定义向量类型重载加法运算符。

operator_add.bas
Type Vector2D
    x As Single
    y As Single
    
    Declare Operator Cast() As String
End Type

Operator + (a As Vector2D, b As Vector2D) As Vector2D
    Dim result As Vector2D
    result.x = a.x + b.x
    result.y = a.y + b.y
    Return result
End Operator

Operator Vector2D.Cast() As String
    Return "(" & Str(x) & ", " & Str(y) & ")"
End Operator

Dim v1 As Vector2D = (1.5, 2.5)
Dim v2 As Vector2D = (3.5, 4.5)

Dim sum As Vector2D = v1 + v2

Print "v1: "; v1
Print "v2: "; v2
Print "sum: "; sum

在这里,我们定义了一个 Vector2D 类型并重载了 + 运算符以逐分量地添加两个向量。我们还定义了一个转换运算符,用于将向量转换为字符串以进行打印。该运算符使向量加法看起来自然。

重载 * 运算符

此示例演示了为向量的标量乘法重载乘法运算符。

operator_multiply.bas
Type Vector2D
    x As Single
    y As Single
End Type

Operator * (v As Vector2D, scalar As Single) As Vector2D
    Dim result As Vector2D
    result.x = v.x * scalar
    result.y = v.y * scalar
    Return result
End Operator

Operator * (scalar As Single, v As Vector2D) As Vector2D
    Return v * scalar
End Operator

Dim vec As Vector2D = (2.0, 3.0)
Dim scaled1 As Vector2D = vec * 1.5
Dim scaled2 As Vector2D = 2.0 * vec

Print "Original: ("; vec.x; ", "; vec.y; ")"
Print "Scaled 1: ("; scaled1.x; ", "; scaled1.y; ")"
Print "Scaled 2: ("; scaled2.x; ", "; scaled2.y; ")"

我们重载了两次 * 运算符,以处理 vector * scalarscalar * vector 两种情况。第二次重载调用第一次重载以避免代码重复。这使得向量缩放操作更加直观。

重载比较运算符

此示例显示了如何为自定义类型重载比较运算符。

operator_compare.bas
Type Book
    title As String
    pages As Integer
    
    Declare Operator = (b As Book) As Boolean
    Declare Operator < (b As Book) As Boolean
End Type

Operator Book.= (b As Book) As Boolean
    Return title = b.title And pages = b.pages
End Operator

Operator Book.< (b As Book) As Boolean
    Return pages < b.pages
End Operator

Dim book1 As Book = ("FreeBasic Guide", 350)
Dim book2 As Book = ("Advanced FB", 500)
Dim book3 As Book = ("FreeBasic Guide", 350)

Print "book1 = book2: "; (book1 = book2)
Print "book1 = book3: "; (book1 = book3)
Print "book1 < book2: "; (book1 < book2)

我们为 Book 类型定义了相等和小于运算符。当标题和页数都匹配时,两本书相等。当一本书的页数少于另一本书时,它就小于另一本书。这些运算符实现了自然的比较语法。

重载转换运算符

此示例演示了为类型转换重载转换运算符。

operator_cast.bas
Type Temperature
    celsius As Single
    
    Declare Operator Cast() As Single
    Declare Operator Cast() As String
End Type

Operator Temperature.Cast() As Single
    Return celsius
End Operator

Operator Temperature.Cast() As String
    Return Str(celsius) & "°C"
End Operator

Dim temp As Temperature = (25.5)
Dim fahrenheit As Single = temp * 9 / 5 + 32

Print "Temperature: "; temp
Print "In Fahrenheit: "; fahrenheit

我们重载了两次转换运算符,将 Temperature 转换为 SingleString。数字转换允许进行算术运算,而字符串转换则提供了格式化的表示。这使得该类型更加通用。

重载赋值运算符

此示例显示了如何重载赋值运算符(=)。

operator_assign.bas
Type StringWrapper
    value As String
    
    Declare Operator Let (s As String)
    Declare Operator Cast() As String
End Type

Operator StringWrapper.Let (s As String)
    value = "Wrapper: " & s
End Operator

Operator StringWrapper.Cast() As String
    Return value
End Operator

Dim wrapper As StringWrapper
wrapper = "Test String"

Print wrapper

我们重载了赋值运算符(Let)来修改字符串如何分配给我们的 StringWrapper 类型。该运算符会在分配的字符串前添加一个前缀。这演示了自定义的赋值行为。

重载索引运算符

此示例演示了如何重载数组索引运算符([])。

operator_index.bas
Type IntArray
    Private:
    Dim data(0 To 9) As Integer
    
    Public:
    Declare Operator [] (index As Integer) ByRef As Integer
End Type

Operator IntArray.[] (index As Integer) ByRef As Integer
    If index < 0 Or index > 9 Then
        Print "Index out of bounds"
        Return data(0)
    End If
    Return data(index)
End Operator

Dim arr As IntArray
arr[3] = 42
arr[10] = 99 ' Will trigger error message

Print "arr[3] = "; arr[3]

我们重载了索引运算符,为我们的自定义数组类型提供了边界检查。该运算符返回一个引用,允许修改数组元素。无效索引会触发错误消息并返回第一个元素。

重载函数调用运算符

此示例显示了如何重载函数调用运算符(())。

operator_call.bas
Type Multiplier
    factor As Integer
    
    Declare Operator () (x As Integer) As Integer
End Type

Operator Multiplier.() (x As Integer) As Integer
    Return x * factor
End Operator

Dim double As Multiplier = (2)
Dim triple As Multiplier = (3)

Print "Double 5: "; double(5)
Print "Triple 5: "; triple(5)

我们创建了一个 Multiplier 类型,该类型将数字乘以固定因子。重载函数调用运算符允许我们将实例用作函数。这创建了灵活、可配置的类函数对象。

最佳实践

本教程通过实际示例介绍了 FreeBasic 的 Operator 关键字,展示了在不同场景下的运算符重载。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 FreeBasic 教程