FreeBasic Operator Keyword
last modified June 16, 2025
The FreeBasic Operator
keyword enables operator overloading for
user-defined types. It allows custom behavior for standard operators when
working with custom types.
Basic Definition
Operator overloading lets you define how operators behave with custom types. FreeBasic supports overloading most operators including arithmetic, comparison, and assignment operators.
The Operator
keyword is used to create operator procedures that
specify the behavior when the operator is used with custom types. This makes
code more intuitive and readable.
Overloading the + Operator
This example shows how to overload the addition operator for a custom vector type.
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
Here we define a Vector2D
type and overload the +
operator to add two vectors component-wise. We also define a cast operator
to convert the vector to a string for printing. The operator makes vector
addition look natural.
Overloading the * Operator
This example demonstrates overloading the multiplication operator for scalar multiplication of vectors.
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; ")"
We overload the *
operator twice to handle both vector * scalar
and scalar * vector
cases. The second overload calls the first
to avoid code duplication. This makes vector scaling operations more intuitive.
Overloading Comparison Operators
This example shows how to overload comparison operators for a custom type.
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)
We define equality and less-than operators for the Book
type.
Two books are equal if both title and page count match. One book is less
than another if it has fewer pages. These operators enable natural comparison
syntax.
Overloading the Cast Operator
This example demonstrates overloading the cast operator for type conversion.
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
We overload the cast operator twice to convert a Temperature
to both Single
and String
. The numeric cast
enables arithmetic operations, while the string cast provides a formatted
representation. This makes the type more versatile.
Overloading the Assignment Operator
This example shows how to overload the assignment operator (=).
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
We overload the assignment operator (Let
) to modify how strings
are assigned to our StringWrapper
type. The operator adds a
prefix to the assigned string. This demonstrates custom assignment behavior.
Overloading the Index Operator
This example demonstrates overloading the array index operator ([]).
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]
We overload the index operator to provide bounds checking for our custom array type. The operator returns a reference to allow modification of array elements. Invalid indexes trigger an error message and return the first element.
Overloading the Function Call Operator
This example shows how to overload the function call operator (()).
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)
We create a Multiplier
type that multiplies numbers by a
fixed factor. Overloading the function call operator lets us use instances
like functions. This creates flexible, configurable function-like objects.
Best Practices
- Consistency: Make overloaded operators behave like their built-in counterparts.
- Clarity: Only overload operators when the meaning is obvious.
- Completeness: Overload related operators together (e.g., + and -).
- Efficiency: Implement operators efficiently to avoid performance issues.
- Documentation: Clearly document the behavior of overloaded operators.
This tutorial covered the FreeBasic Operator
keyword with practical
examples showing operator overloading in different scenarios.
Author
List all FreeBasic Tutorials.