创建类或用户定义类型时自动调用
语法
Type typename
End Type
Constructor typename ( [ parameters ] )
statements
End Constructor
参数
说明
当创建用户定义的
Type或
Class变量时,会调用
Constructor方法。
typename 是声明和定义
Constructor方法的类型的名称。
typename 的名称解析遵循与
Namespace中使用的过程相同的规则。
类型或类可能存在多个构造函数。调用的确切构造方法取决于初始化变量时匹配的
parameter 签名。构造函数方法声明中可能存在多个
parameter .
传递一个隐藏的
This参数,其类型与
typename 相同。
This可选地用于访问将在
Constructor方法中初始化的
Type或
Class的字段。
当声明全局或本地静态实例
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
方言差异
与QB差别
参考