FreeBasic 运算符关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 Operator 关键字支持用户定义类型的运算符重载。它允许为自定义类型的标准运算符定义自定义行为。
基本定义
运算符重载允许您定义运算符与自定义类型的行为方式。FreeBasic 支持重载大多数运算符,包括算术、比较和赋值运算符。
Operator 关键字用于创建运算符过程,这些过程指定运算符与自定义类型一起使用时的行为。这使得代码更直观、更易读。
重载 + 运算符
此示例显示了如何为自定义向量类型重载加法运算符。
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 类型并重载了 + 运算符以逐分量地添加两个向量。我们还定义了一个转换运算符,用于将向量转换为字符串以进行打印。该运算符使向量加法看起来自然。
重载 * 运算符
此示例演示了为向量的标量乘法重载乘法运算符。
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 * scalar 和 scalar * vector 两种情况。第二次重载调用第一次重载以避免代码重复。这使得向量缩放操作更加直观。
重载比较运算符
此示例显示了如何为自定义类型重载比较运算符。
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 类型定义了相等和小于运算符。当标题和页数都匹配时,两本书相等。当一本书的页数少于另一本书时,它就小于另一本书。这些运算符实现了自然的比较语法。
重载转换运算符
此示例演示了为类型转换重载转换运算符。
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 转换为 Single 和 String。数字转换允许进行算术运算,而字符串转换则提供了格式化的表示。这使得该类型更加通用。
重载赋值运算符
此示例显示了如何重载赋值运算符(=)。
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 类型。该运算符会在分配的字符串前添加一个前缀。这演示了自定义的赋值行为。
重载索引运算符
此示例演示了如何重载数组索引运算符([])。
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]
我们重载了索引运算符,为我们的自定义数组类型提供了边界检查。该运算符返回一个引用,允许修改数组元素。无效索引会触发错误消息并返回第一个元素。
重载函数调用运算符
此示例显示了如何重载函数调用运算符(())。
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 关键字,展示了在不同场景下的运算符重载。