ZetCode

FreeBasic 构造函数关键字

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

FreeBasic 的 Constructor 关键字定义了在创建对象时用于初始化对象的特殊方法。在声明用户定义类型的实例时,构造函数会自动调用。

基本定义

在 FreeBasic 中,ConstructorType (UDT) 的一个特殊成员函数,它在类型定义内部声明,并在外部实现。当创建该类型的对象时,它会被执行。

构造函数可以接受参数来初始化对象成员。它们确保对象以有效状态启动。FreeBasic 支持无参构造函数和有参构造函数。构造函数在 Type 内部使用 Declare Constructor 声明,并在 Type 外部使用 Constructor TypeName 定义。

简单构造函数

此示例展示了一个基本的无参构造函数。

simple_constructor.bas
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 对象时,构造函数会自动运行,设置默认值并打印一条消息。

有参构造函数

构造函数可以接受参数来使用特定值初始化对象。

parameterized_constructor.bas
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 允许定义具有不同参数的多个构造函数。

multiple_constructors.bas
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) 进行动态分配来调用有参构造函数。注意访问模式的不同:堆栈对象的成员直接访问,堆对象的指针访问 (->)。

带成员初始化的构造函数

构造函数可以使用更显式的语法来初始化成员,如果需要的话。

member_init_constructor.bas
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) 动态创建,我们通过箭头运算符 (->) 的指针访问成员。

带动态分配的构造函数

构造函数与动态分配的对象一起工作。

dynamic_constructor.bas
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 删除对象以释放内存。

带数组成员的构造函数

构造函数可以初始化数组成员。

array_constructor.bas
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 构造函数展示了如何在构造函数中初始化数组成员。无参构造函数遍历所有数组元素,将每个元素设置为“空槽”,并将计数初始化为零。这确保了当创建一个库存对象时,所有槽都以已知、已初始化的状态开始。

带对象组合的构造函数

构造函数可以初始化包含其他对象的对象。

composition_constructor.bas
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 关键字,展示了它在不同场景下的用法。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出所有 FreeBasic 教程

;
;