Constructor
 
创建类或用户定义类型时自动调用

语法

Type typename
Declare Constructor ( )
Declare Constructor ( [ ByRef | ByVal ] parameter As datatype [ = default ] [, ... ] )
End Type

Constructor typename ( [ parameters ] )
statements
End Constructor

参数

typename
TypeClass的名称

说明

当创建用户定义的TypeClass变量时,会调用Constructor方法。

typename 是声明和定义Constructor方法的类型的名称。typename 的名称解析遵循与Namespace中使用的过程相同的规则。

类型或类可能存在多个构造函数。调用的确切构造方法取决于初始化变量时匹配的parameter 签名。构造函数方法声明中可能存在多个parameter .

传递一个隐藏的This参数,其类型与typename 相同。This可选地用于访问将在Constructor方法中初始化的TypeClass的字段。

当声明全局或本地静态实例typename 时,以及使用New运算符动态赋值typename 时,将调用构造函数。有关不同的构造函数语法,请参见下面的示例。

副本Constructor是一个特殊的构造函数,用于从现有对象初始化新对象。调用副本Constructor的三种一般情况:当实例化一个对象并使用另一个对象(在一个指令中)初始化时,当通过值传递对象时,当通过值从函数返回一个对象(通过使用Return x 语句)。
注意:当通过值从函数返回对象时,通过使用Function = x (或function_identifier = x )赋值,首先调用Constructor一次,然后在每个赋值时调用Let (Assign)运算符。
如果浅层隐式副本构造函数不够,则必须定义副本Constructor.这种情况发生在对象管理动态赋值的内存或需要特殊构造或复制的其他资源的情况下(例如,如果成员指针指向动态赋值的内存,则隐式副本构造函数将简单地执行隐式指针构造和副本值而不是赋值内存,然后执行数据的副本)。
注意:即使定义了一个明确的默认Constructor,它也不会被隐式复制构造函数调用。

支持嵌套类型中的构造函数的链接。任何有自己的默认构造函数的字段都是先调用的。
关键字Constructor(parameters )可以在构造函数的顶部使用,允许链接同一类型的构造函数。它可以防止编译器发出字段初始化代码(相反,它依赖于链式构造函数来初始化所有内容)。

Constructor也可以像其他成员方法(Sub)直接从typename 实例调用,并具有相同的语法,即使用成员访问操作符,例如obj .Constructor(parameters ).特别地,做this .Constructor(parameters )不被视为链接构造函数,它被允许在任何地方(不仅在构造函数顶部)。一般来说,手动调用对象上的构造函数是不安全的,因为没有调用Destructor,并且旧的对象状态(如果有的话)被覆盖而不会损坏任何旧的成员,这可能导致内存/资源泄漏。

例子

初学者的简单构造函数示例。
Type MyObj
  Foo As Integer Ptr
  
    ''构造函数创建我们的整数,并设置其值。
  Declare Constructor( ByVal DefVal As Integer = 0 )
    ''在对象删除时销毁整数。
  Declare Destructor()
End Type

Constructor MyObj( ByVal DefVal As Integer = 0 )
  Print "在MyObj中创建一个新的整数!"
  Print "整数将具有以下值:" & DefVal
  Print ""
  
    ''创建一个指针,并将其值设置为传递给它的值
    ''构造函数。
  This.Foo = New Integer
  *This.Foo = DefVal
End Constructor

Destructor MyObj()
  Print "在MyObj中删除整数!"
  Print ""
  
    ''删除我在MyObj中创建的指针。
  Delete This.Foo
  This.Foo = 0
End Destructor


Scope
    ''创建一个MyObj类型的对象
    '' Send the value of '10'给构造函数
  Dim As MyObj Bar = 10
  
    '' See if the integer'已被创建。打印其值。
  Print "我们的整数的值是:" & *Bar.Foo
  Print ""
  
  Sleep
End Scope
  '' We'我刚刚走出了一个范围。现在应该调用析构函数
  ''因为我们的对象被删除。
Sleep

更为先进的构造示例,显示构造函数超载等。
Type sample

  _text As String

  Declare Constructor ()
  Declare Constructor ( a As Integer )
  Declare Constructor ( a As Single  ) 
  Declare Constructor ( a As String, b As Byte ) 

  Declare Operator Cast () As String

End Type

Constructor sample ()
  Print "构造函数样本()"
  Print
  this._text = "空"
End Constructor

Constructor sample ( a As Integer )
  Print "构造函数样本(a为整数)"
  Print "a ="; a
  Print
  this._text = Str(a)
End Constructor

Constructor sample ( a As Single )
  Print "构造函数样本(a)"
  Print "a ="; a
  Print
  this._text = Str(a)
End Constructor

Constructor sample ( a As String, b As Byte )
  Print "构造函数样本(a为字符串,b为字节)"
  Print "a ="; a
  Print "b ="; b
  Print
  this._text = Str(a) + "," + Str(b)
End Constructor

Operator sample.cast () As String
  Return this._text
End Operator

Print "创建x1"
Dim x1 As sample

Print "创建x2"
Dim x2 As sample = 1

Print "创建x3"
Dim x3 As sample = 99.9

Print "创建x4"
Dim x4 As sample = sample( "AAAen", 1 )

Print "价值观:"
Print "x1 ="; x1
Print "x2 ="; x2
Print "x3 ="; x3
Print "x4 ="; x4

复制构造函数的示例。
Type UDT
  Dim As String Ptr p                     ''指向字符串的指针
  Declare Constructor ()                  ''默认构造函数
  Declare Constructor (ByRef rhs As UDT)  ''复制构造函数
  Declare Destructor ()                   ''析构函数
End Type

Constructor UDT ()
  This.p = CAllocate(1, SizeOf(String))
End Constructor

Constructor UDT (ByRef rhs As UDT)
  This.p = CAllocate(1, SizeOf(String))
  *This.p = *rhs.p
End Constructor

Destructor UDT ()
  *This.p = ""
  Deallocate This.p
End Destructor


Dim As UDT u0
*u0.p = "复制构造函数存在"
Dim As UDT u = u0
*u0.p = ""  ''检查结果副本与复制对象的独立性
Print *u.p
Sleep

方言差异

  • 仅在-lang fb 选项中支持对象相关功能

与QB差别

  • 新的FreeBASIC

参考