显然是VB6,VB7以上的版本就直接用.NET好了、
首先要有一个类,也就是类模块,使用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
假设自己写的类名叫MyClass1.所有定义为对象类型的变量,均为空壳,并无真正的对象,类似于C++中的对象指针:Dim a As MyClass这样,就有了一个MyClass类型的空壳,表示这个变量a可以装载一个MyClass类型的对象,以及将来a能执行的方法。它为4个字节,存储的是对象的首地址。定义为对象类型的变量,初值均为Nothing,类似于C++中的一个对象指针变量指向NULL。
2.在VB中,对象只能动态创建,通过使用New关键字。这句代码和C++就有点相似了。Dim a As MyClassSet a = New MyClass这两句代码才真正的使a带上内容。
3.“Set a = ……”这样的代码实际上就相当于C++中让指针指向某个对象的操作。省略号的地方可以是一个New出来的新对象,也可以是之前的一个已有的同类型的对象,也可以是Nothing,即让它再指向空,变回空壳:Dim a As MyClassDim b As MyClassSet a = New MyClassSet b = aSet a = Nothing与数值类型和字符串变量不一样的是,对象变量在条件表达式中判断相等可不是还用=等号,而是用关键字IsIf a Is Nothing Then '如果a是一个空壳End If
4.Object类型的变量:Dim a As ObjectObject类型就像是VB中所有类的大基类一样,此时a这个空壳里可以装任何类型的对象,也可以通过a调用a里装的对象的属性方法等。这样说来,VB还带有一点支持“动态联编”的感觉。
如果理解了拓1的内容,自然就会理解,VB触发构造过程的时机为使用New关键字的时候。Dim a As MyClassSet a = New MyClass '执行到这句时就会调用构造过程
VB对象触发析构过程的时机是在这个对象没有被任何壳子装着的时候,也就是没有任何指针指向它的时候,它就会被析构。下面举3个例子:Private Sub Command1_Click() Dim a As MyClass Set a = New MyClass '触发构造过程 Set a = Nothing '此时由于没有任何壳子装着原来a里的对象了,所以这句会触发析构过程End SubPrivate 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
VB中没有复制构造函数,因为没有场合。从拓1的内容可以看出,如果函数参数中传的是对象,那么它一定为地址传递,不需要将原对象复制一份到参数中。另一方面,VB不支持带参数的构造过程,这也决定着VB不会有复制构造函数,因为我们因此也无法在新建对象时指定新对象的模样。