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