使用构造函数和析构函数

构造函数和析构函数控制对象的创建和毁坏。

若要为类创建构造函数,请在类定义的任何位置创建名为 Sub New 的过程。若要创建参数化构造函数,请像为其他任何过程指定参数那样为 Sub New 指定参数的名称和数据类型,如下面的代码所示:


ExpandedBlockStart.gifContractedBlock.gifSub New()Sub New(ByVal sString As String)

构造函数频繁地重载,如下面的代码所示:

 

ExpandedBlockStart.gif ContractedBlock.gif Sub New() Sub New(ByVal sString As String, iInt As Integer)

 

当定义从另一个类派生的类时,构造函数的第一行必须是对基类构造函数的调用,除非基类有一个可访问的无参数构造函数。例如,对包含以上构造函数的基类的调用将为 MyBase.New(sString)。另外,MyBase.New 是可选的,Visual Basic .NET 运行库会隐式调用它。

在编写调用父对象的构造函数的代码后,可以向 Sub New 过程添加任何附加初始化代码。当 Sub New 作为参数化构造函数调用时可以接受参数。这些参数从调用构造函数的过程传递(例如 Dim AnObject As New ThisClass(X))。

下面的代码实例展示如何使用 DisposeFinalize 释放资源:

 
 
None.gif '  Design pattern for a base class.
ExpandedBlockStart.gifContractedBlock.gif
Public   Class Base Class Base
InBlock.gif    
Implements IDisposable
InBlock.gif    
' Implement IDisposable.
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Public Overloads Sub Dispose()Sub Dispose() Implements IDisposable.Dispose
InBlock.gif        Dispose(
True)
InBlock.gif        GC.SuppressFinalize(
Me)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Protected Overridable Overloads Sub Dispose()Sub Dispose(ByVal disposing As Boolean)
InBlock.gif        
If disposing Then
InBlock.gif            
' Free other state (managed objects).
InBlock.gif
        End If
InBlock.gif        
' Free your own state (unmanaged objects).
InBlock.gif
        ' Set large fields to null.
ExpandedSubBlockEnd.gif
    End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Protected Overrides Sub Finalize()Sub Finalize()
InBlock.gif        
' Simply call Dispose(False).
InBlock.gif
        Dispose(False)
ExpandedSubBlockEnd.gif    
End Sub

ExpandedBlockEnd.gif
End Class

None.gif
None.gif
'  Design pattern for a derived class.
ExpandedBlockStart.gifContractedBlock.gif
Public   Class Derived Class Derived
InBlock.gif    
Inherits Base
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Protected Overloads Overrides Sub Dispose()Sub Dispose(ByVal disposing As Boolean)
InBlock.gif        
If disposing Then
InBlock.gif            
' Release managed resources.
InBlock.gif
        End If
InBlock.gif        
' Release unmanaged resources.
InBlock.gif
        ' Set large fields to null.
InBlock.gif
        ' Call Dispose on your base class.
InBlock.gif
        MyBase.Dispose(disposing)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif    
' The derived class does not have a Finalize method
InBlock.gif
    ' or a Dispose method with parameters because it inherits
InBlock.gif
    ' them from the base class.
ExpandedBlockEnd.gif
End Class

下面的示例说明使用 Dispose 析构函数的一个通用设计模式:

 
 
None.gif Dim  con  As  Connection, rs  As  RecordSet
None.gif
Try
None.gif   con 
=   New  Connection( " xyz " )
None.gif   rs 
=   New  RecordSet(con,  " MyTable " )
None.gif   
'  Use the connection if successful.
None.gif
Finally
None.gif
'  Call the Dispose method when done with any created objects.
None.gif
If   Not  con  Is   Nothing   Then
None.gif      con.Dispose()
None.gif   
End   If
None.gif   
If   Not  rs  Is   Nothing   Then
None.gif      rs.Dispose()
None.gif   
End   If
None.gif
End   Try

下一个示例使用参数化构造函数创建一个对象,并在不再需要该对象时调用析构函数:

 
 
ExpandedBlockStart.gif ContractedBlock.gif Sub TestConstructorsAndDestructors() Sub TestConstructorsAndDestructors()
InBlock.gif   
Dim X As Integer = 6
InBlock.gif   
Dim AnObject As New ThisClass(X)
InBlock.gif   
' Place statements here that use the object.
InBlock.gif
   AnObject.DoSomething()
InBlock.gif   
' Test the parameterized constructor. 
InBlock.gif
   MsgBox("The value of ThisProperty after being initialized " & _
InBlock.gif          
" by the constructor is " & AnObject.ThisProperty)
InBlock.gif   
' Run the Dispose method when you are done with the object.
InBlock.gif
   AnObject.Dispose()
ExpandedBlockEnd.gif
End Sub

None.gif
ExpandedBlockStart.gifContractedBlock.gif   
Public   Class BaseClass Class BaseClass
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Sub New()Sub New()
InBlock.gif         
MsgBox("The base class is initializing with Sub New.")
ExpandedSubBlockEnd.gif      
End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Protected Overrides Sub Finalize()Sub Finalize()
InBlock.gif         
MsgBox("The base class is destroying objects with Sub Finalize.")
InBlock.gif         
' Place final cleanup tasks here.
InBlock.gif
         MyBase.Finalize()
ExpandedSubBlockEnd.gif      
End Sub

ExpandedBlockEnd.gif   
End Class

None.gif
ExpandedBlockStart.gifContractedBlock.gif   
Public   Class ThisClass Class ThisClass
InBlock.gif      
Inherits BaseClass
InBlock.gif      
Implements IDisposable ' Implements the Dispose method of IDisposable.
InBlock.gif
      Private m_PropertyValue  As Integer
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Sub New()Sub New(ByVal SomeValue As Integer)
InBlock.gif         
MyBase.New() ' Call MyBase.New if this is a derived class.
InBlock.gif
         MsgBox("Sub New is initializing the class ThisClass.")
InBlock.gif         
' Place initialization statements here. 
InBlock.gif
         m_PropertyValue  = SomeValue
ExpandedSubBlockEnd.gif      
End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Property ThisProperty()Property ThisProperty() As Integer
InBlock.gif         
Get
InBlock.gif            ThisProperty 
= m_PropertyValue 
InBlock.gif         
End Get
InBlock.gif         
Set(ByVal Value As Integer)
InBlock.gif            m_PropertyValue  
= Value
InBlock.gif         
End Set
ExpandedSubBlockEnd.gif      
End Property

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Sub DoSomething()Sub DoSomething()
InBlock.gif         
' Place code here that does some task.
ExpandedSubBlockEnd.gif
      End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Protected Overrides Sub Finalize()Sub Finalize()
InBlock.gif         
MsgBox("Finalize is destroying objects in ThisClass.")
InBlock.gif         
' Place final cleanup tasks here.
InBlock.gif
         MyBase.Finalize()
ExpandedSubBlockEnd.gif      
End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Overridable Sub Dispose()Sub Dispose() Implements IDisposable.Dispose
InBlock.gif         
MsgBox("The ThisClass is running Dispose.")
ExpandedSubBlockEnd.gif      
End Sub

ExpandedBlockEnd.gif   
End Class

当运行此示例时,ThisClass 类调用 BaseClass 类的 Sub New 构造函数。在基类中的构造函数完成以后,ThisClass 类运行 Sub New 中剩余的语句,这些语句初始化 ThisProperty 属性的值。

当不再需要该类时,在 ThisClass 中调用 Dispose 析构函数。

如果最初是从窗体创建 ThisClass 的实例,则在关闭该窗体之前似乎什么都没有发生。Finalize 析构函数此时在 ThisClass 类中运行,最后将在 BaseClass 类中运行。

转载于:https://www.cnblogs.com/zman/archive/2006/07/25/458903.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 构造函数析构函数是 C++ 中两个重要的特殊成员函数。 构造函数用于创建对象时初始化数据成员,其名称与类名相同,没有返回类型,可以有多个重载版本。当对象被创建时,构造函数自动被调用,作用是初始化对象的数据成员,为对象分配内存空间并设置初始状态。 析构函数的名称也与类名相同,但前面加上一个波浪号(~),没有返回类型,也可以有多个重载版本。当对象被销毁时,析构函数自动被调用,作用是释放对象占用的内存空间,清理对象使用的资源,确保程序正常结束。 构造函数析构函数通常被用于管理动态内存分配,确保资源的正确分配和释放,避免内存泄漏和资源浪费。 例如,我们可以定义一个类,其中包含一个动态分配的数组,构造函数负责分配数组内存,析构函数负责释放数组内存: ```c++ class MyClass { public: MyClass(int n) { data = new int[n]; } ~MyClass() { delete[] data; } private: int* data; }; ``` 在使用这个类创建对象时,构造函数将分配所需的数组内存,而在对象被销毁时,析构函数将释放所占用的内存空间,确保程序正常结束。 ### 回答2: 构造函数 (Constructor) 是一种特殊的成员函数,它在创建对象时被自动调用。它的主要作用是初始化对象的成员变量,为对象提供初始状态。构造函数与类名相同,没有返回类型,也不能被声明为const。在创建一个对象时,可以根据需要显式地调用构造函数,也可以隐式地调用构造函数构造函数有以下几个特点: 1. 构造函数的名称和类名相同。 2. 构造函数没有返回值类型,也不需要return语句来返回值。 3. 构造函数可以有参数,根据参数的不同可以有多种形式的构造函数。 4. 如果没有使用构造函数,在创建对象后对象的成员变量的状态是不确定的。 析构函数 (Destructor) 是一种特殊的成员函数,它在对象被销毁的时候自动调用。它的主要作用是进行资源的释放和清理工作,如释放动态分配的内存或关闭打开的文件。析构函数与类名相同,在名称前加上~符号,没有返回类型,也不能被声明为const。 析构函数有以下几个特点: 1. 析构函数的名称是在类名前加上~符号。 2. 析构函数没有返回值类型,也不需要return语句来返回值。 3. 析构函数不带参数,只能有一个析构函数。 4. 在对象销毁的时候自动调用析构函数进行资源的释放和清理工作。 构造函数析构函数是一对相互配对的重要函数,它们在对象的生命周期中起着关键的作用。构造函数负责对象的初始化,析构函数负责对象的销毁和资源的释放。通过使用构造函数析构函数,可以实现对对象的完整管理和控制,确保对象的正确创建和销毁,以及资源的正确释放。 ### 回答3: 构造函数(Constructor)是一种特殊的成员函数,用于创建和初始化对象。构造函数的名称与类名相同,没有返回值类型。它在对象被创建时自动调用,无需手动调用。构造函数的主要作用是对对象的成员变量进行初始化,确保对象在被创建后具备正确的状态。 析构函数(Destructor)是一种特殊的成员函数,用于在对象被销毁之前执行清理工作。析构函数的名称与类名相同,在名称前加上"~"符号。它在对象被销毁时自动调用,无需手动调用。析构函数的主要作用是释放对象占用的资源,如关闭文件、释放内存等。 构造函数析构函数的编写和使用是成对的,它们共同负责对象的生命周期管理。构造函数负责对象的初始化,确保对象可用;而析构函数负责对象的清理工作,确保对象在不再需要时能够正确地释放资源。 构造函数可以有多个,以满足不同的对象创建需求。可以有默认参数的构造函数,使得对象创建更加灵活。当对象被创建时,会调用与之相匹配的构造函数析构函数只有一个,用于销毁对象。在对象被销毁时,编译器会自动调用析构函数,以释放对象占用的资源。析构函数通常没有参数,且不会返回任何值。 通过构造函数析构函数的合理设计,可以确保对象的正确初始化和清理,提高代码的可读性和可维护性。因此,在定义类时,经常需要定义构造函数析构函数来管理对象的生命周期。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值