FreeBasic 构造函数关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 Constructor 关键字定义了在创建对象时用于初始化对象的特殊方法。在声明用户定义类型的实例时,构造函数会自动调用。
基本定义
在 FreeBasic 中,Constructor 是 Type (UDT) 的一个特殊成员函数,它在类型定义内部声明,并在外部实现。当创建该类型的对象时,它会被执行。
构造函数可以接受参数来初始化对象成员。它们确保对象以有效状态启动。FreeBasic 支持无参构造函数和有参构造函数。构造函数在 Type 内部使用 Declare Constructor 声明,并在 Type 外部使用 Constructor TypeName 定义。
简单构造函数
此示例展示了一个基本的无参构造函数。
Type Person
fname As String
age As Integer
Declare Constructor()
End Type
Constructor Person()
fname = "Unknown"
age = 0
Print "Person object created"
End Constructor
Dim p As Person
Print "Name: "; p.fname
Print "Age: "; p.age
在这里,我们定义了一个 Person 类型,其构造函数声明在类型内部,实现则在类型外部。Declare Constructor() 位于 Type 内部,而 Constructor Person() 包含实际代码。当我们创建 Person 对象时,构造函数会自动运行,设置默认值并打印一条消息。
有参构造函数
构造函数可以接受参数来使用特定值初始化对象。
Type Rectangle
width As Double
height As Double
Declare Constructor()
Declare Constructor(w As Double, h As Double)
End Type
Constructor Rectangle()
width = 0.0
height = 0.0
End Constructor
Constructor Rectangle(w As Double, h As Double)
width = w
height = h
Print "Rectangle created: "; width; "x"; height
End Constructor
Dim rect As Rectangle Ptr = New Rectangle(5.5, 3.2)
Print "Area: "; rect->width * rect->height
Delete rect
这个 Rectangle 类型演示了构造函数重载,它同时具有默认(无参)构造函数和有参构造函数。要使用带特定值的有参构造函数,我们使用 New Rectangle(parameters) 动态创建对象。有参构造函数在分配时被调用,使用提供的尺寸初始化对象。我们通过指针访问成员,并使用 Delete 进行清理。
多个构造函数
FreeBasic 允许定义具有不同参数的多个构造函数。
Type Book
title As String
author As String
pages As Integer
Declare Constructor()
Declare Constructor(t As String, a As String, p As Integer)
End Type
Constructor Book()
title = "Untitled"
author = "Unknown"
pages = 0
End Constructor
Constructor Book(t As String, a As String, p As Integer)
title = t
author = a
pages = p
End Constructor
Dim book1 As Book
Dim book2 As Book Ptr = New Book("The Hobbit", "J.R.R. Tolkien", 310)
Print "Book1: "; book1.title; " by "; book1.author
Print "Book2: "; book2->title; " by "; book2->author
Delete book2
Book 类型通过使用 Declare Constructor 声明两个构造函数来演示构造函数重载。每个构造函数都使用 Constructor Book 单独实现。第一本书自动使用默认构造函数,而第二本书使用 New Book(parameters) 进行动态分配来调用有参构造函数。注意访问模式的不同:堆栈对象的成员直接访问,堆对象的指针访问 (->)。
带成员初始化的构造函数
构造函数可以使用更显式的语法来初始化成员,如果需要的话。
Type Point
x As Integer
y As Integer
Declare Constructor(x As Integer, y As Integer)
End Type
Constructor Point(x As Integer, y As Integer)
This.x = x
This.y = y
End Constructor
Dim pt As Point Ptr = New Point(10, 20)
Print "Point coordinates: ("; pt->x; ", "; pt->y; ")"
Delete pt
这个 Point 构造函数演示了参数名阴影,即构造函数参数的名称与类型成员的名称相同。This 关键字用于区分成员变量 (This.x, This.y) 和构造函数参数 (x, y)。对象使用 New Point(parameters) 动态创建,我们通过箭头运算符 (->) 的指针访问成员。
带动态分配的构造函数
构造函数与动态分配的对象一起工作。
Type Student
fname As String
grade As Integer
Declare Constructor(n As String, g As Integer)
End Type
Constructor Student(n As String, g As Integer)
fname = n
grade = g
Print "Student "; fname; " created"
End Constructor
Dim s As Student Ptr = New Student("Alice", 11)
Print s->fname; " is in grade "; s->grade
Delete s
这里我们使用 New 动态创建了一个 Student 对象。在分配过程中,构造函数会自动调用,使用提供的参数初始化对象。我们使用箭头运算符 (->) 通过指针访问成员,并且必须记住在完成后使用 Delete 删除对象以释放内存。
带数组成员的构造函数
构造函数可以初始化数组成员。
Type Inventory
items(4) As String
count As Integer
Declare Constructor()
End Type
Constructor Inventory()
For i As Integer = 0 To 4
items(i) = "Empty slot"
Next
count = 0
End Constructor
Dim inv As Inventory
For i As Integer = 0 To 4
Print i; ": "; inv.items(i)
Next
Inventory 构造函数展示了如何在构造函数中初始化数组成员。无参构造函数遍历所有数组元素,将每个元素设置为“空槽”,并将计数初始化为零。这确保了当创建一个库存对象时,所有槽都以已知、已初始化的状态开始。
带对象组合的构造函数
构造函数可以初始化包含其他对象的对象。
Type Engine
horsepower As Integer
Declare Constructor()
Declare Sub SetHorsepower(hp As Integer)
End Type
Constructor Engine()
horsepower = 0
End Constructor
Sub Engine.SetHorsepower(hp As Integer)
horsepower = hp
End Sub
Type Car
model As String
engine As Engine
Declare Constructor(m As String, hp As Integer)
End Type
Constructor Car(m As String, hp As Integer)
model = m
engine.SetHorsepower(hp)
End Constructor
Dim myCar As Car Ptr = New Car("Sedan", 150)
Print myCar->model; " has "; myCar->engine.horsepower; " HP"
Delete myCar
此示例演示了对象组合,其中 Car 类型包含一个嵌入式 Engine 对象。Engine 类型有一个默认构造函数和一个 SetHorsepower 方法来配置其属性。汽车使用 New Car(parameters) 动态创建,这将调用汽车的构造函数。构造函数初始化模型名称,并使用引擎的 SetHorsepower 方法来配置嵌入式引擎对象。这种方法展示了如何在直接调用带参数的构造函数复杂时进行组合。
最佳实践
- 初始化:始终在构造函数中初始化所有成员变量。
- 重载:为不同的初始化场景使用多个构造函数。
- 验证:在适当时验证构造函数参数。
- 简洁性:保持构造函数简单;避免复杂的逻辑。
- 文档:记录构造函数的行为和参数。
本教程通过实际示例涵盖了 FreeBasic 的 Constructor 关键字,展示了它在不同场景下的用法。