您的位置首页生活百科

vb中类的构造函数与析构函数

vb中类的构造函数与析构函数

的有关信息介绍如下:

vb中类的构造函数与析构函数

VB中到底有没有构造函数和析构函数?答案是肯定的!

之前在网上搜索了一些相关内容,发现,很多关于VB构造函数的提问都被回复为“vb中没有构造函数”,这一不包含任何模糊性副词的肯定句。而一旦涉及到构造函数,话题就会被立即偷换为VB.NET或java和C++。之前在百度上搜索"vb 构造函数"得到的也都是与VB.NET相关的搜索结果。所以,这就是我要发表本经验的原因,希望本经验能帮到越来越多的人!同时,我也想奉劝那些在网上回答问题的人,在回答问题之前一定要“三思而后行”,如果对vb的了解不够深入就最好不要轻易下定论误导别人。

首先要有一个类,也就是类模块,使用VB类生成器或全部自己写代码均可,在此不详叙,网上关于此的技术文章还是很多的。

简单理解一下构造函数和析构函数。构造函数和析构函数从逻辑上讲是咱们写代码给系统用的,咱们自己没有场合去手动调用这样的函数,即使是能手动调用那一般也没这么干的,因为它是一个用来初始化对象(收拾残局)的函数,所以它会在对象建立后(销毁前)马上被调用,不容时间去让我们手动调用。

若用VB的思维去考虑刚才的那个问题,那么就有点像是在对象被建立时触发了这个对象中一个事件,就像Private Sub Form_Load()一样,在对象建立后,就会自动跳转到这里执行里面的代码。好,理解到这里,我就可以告诉大家了,VB中类的构造函数和析构函数分别是

Sub Class_Initialize()

End Sub

Sub Class_Terminate()

End Sub

可以自己亲自打代码在类模块中添加这两个过程,也可以真的就像是在窗体里添加事件一样,直接在左上角写着"(通用)"的下拉框里选择"Class",然后就在右边的下拉框里VB其实就已经为我们准备考了Initialize和Terminate两个过程的声明。

就像第二步里说的一样,不希望我们去手动调用这两个过程,所以这两个过程一般被声明为Private,这样在类外就找不到这两个方法了。如果是用的第二种方法创建的这两个过程,VB直接就会把它们声明为Private。

Private Sub Class_Initialize()

……

End Sub

Private Sub Class_Terminate()

……

End Sub

到此,大家可能会有个问题,就是这个构造过程可不可以带上参数呢?这个我会很遗憾地告诉大家,是不能的,VB没有给我们提供对编写带参数的构造过程的支持。若尝试以下代码:

Private Sub Class_Initialize(Optional ByVal a As Integer = 0)

……

End Sub

编译就会报错,说“过程声明与同名事件或过程的描述不匹配”。当然,VB也不支持这种写法:

Set a As New MyClass(5)

假设自己写的类名叫MyClass

假设自己写的类名叫MyClass

1.所有定义为对象类型的变量,均为空壳,并无真正的对象,类似于C++中的对象指针:

Dim a As MyClass

这样,就有了一个MyClass类型的空壳,表示这个变量a可以装载一个MyClass类型的对象,以及将来a能执行的方法。它为4个字节,存储的是对象的首地址。定义为对象类型的变量,初值均为Nothing,类似于C++中的一个对象指针变量指向NULL。

2.在VB中,对象只能动态创建,通过使用New关键字。这句代码和C++就有点相似了。

Dim a As MyClass

Set a = New MyClass

这两句代码才真正的使a带上内容。

3.“Set a = ……”这样的代码实际上就相当于C++中让指针指向某个对象的操作。省略号的地方可以是一个New出来的新对象,也可以是之前的一个已有的同类型的对象,也可以是Nothing,即让它再指向空,变回空壳:

Dim a As MyClass

Dim b As MyClass

Set a = New MyClass

Set b = a

Set a = Nothing

与数值类型和字符串变量不一样的是,对象变量在条件表达式中判断相等可不是还用=等号,而是用关键字Is

If a Is Nothing Then

'如果a是一个空壳

End If

4.Object类型的变量:

Dim a As Object

Object类型就像是VB中所有类的大基类一样,此时a这个空壳里可以装任何类型的对象,也可以通过a调用a里装的对象的属性方法等。这样说来,VB还带有一点支持“动态联编”的感觉。

如果理解了拓1的内容,自然就会理解,VB触发构造过程的时机为使用New关键字的时候。

Dim a As MyClass

Set a = New MyClass '执行到这句时就会调用构造过程

VB对象触发析构过程的时机是在这个对象没有被任何壳子装着的时候,也就是没有任何指针指向它的时候,它就会被析构。下面举3个例子:

Private Sub Command1_Click()

Dim a As MyClass

Set a = New MyClass '触发构造过程

Set a = Nothing '此时由于没有任何壳子装着原来a里的对象了,所以这句会触发析构过程

End Sub

Private Sub Command2_Click()

Dim a As MyClass

Set a = New MyClass '触发构造过程

End Sub 'a的生存期至此结束,也相当于没有任何壳子装着原来a里的对象了,所以这句会触发析构过程

Private Sub Command3_Click()

Dim a As MyClass

Dim b As MyClass

Set a = New MyClass '触发构造过程

Set b = a '理解为两个指针指向同一个对象

Set a = Nothing '此时因为还有b仍在装着这个对象,所以它不会被析构

Set b = Nothing '这时才会触发析构

End Sub