B b = new B(); //執行基類A的構造函數A()再執行派生類的構造函數B()
B b = new B(); //執行基類A的構造函數A()再執行派生類的構造函數B(int)
B b = new B(); //執行執行基類A的構造函數A(int) 再執行派生類的
構造函數B(intint)
在這裡構造函數的執行次序是一定要分析清楚的另外如果基類A中沒有提供無參構造函數public A( ) { x = ; }則在派生類的所有構造函數成員初始化表中必須指出基類A的有參構造函數A(i)如下所示
class A
{
private int x;
public A( int i ) { x = i; }
};
class B : A
{
private int y;
public B():A(i) { y = ; }
public B(int i):A(i) { y = i; }
public B(int i int j):A(i) { y = j; }
};
三.析構函數和垃圾回收器在C#中的運用
析構函數是實現銷毀一個類的實例的方法成員析構函數不能有參數不能任何修飾符而且不能被調用由於析構函數的目的與構造函數的相反就加前綴~以示區別
雖然C#(更確切的說是CLR)提供了一種新的內存管理機制自動內存管理機制(Automatic memory management)資源的釋放是可以通過垃圾回收器 自動完成的一般不需要用戶干預但在有些特殊情況下還是需要用到析構函數的如在C#中非托管資源的釋放
資源的釋放一般是通過垃圾回收器自動完成的但具體來說仍有些需要注意的地方
值類型和引用類型的引用其實是不需要什麼垃圾回收器來釋放內存的因為當它們出了作用域後會自動釋放所占內存因為它們都保存在棧(Stack)中;
只有引用類型的引用所指向的對象實例才保存在堆(Heap)中而堆因為是一個自由存儲空間所以它並沒有像棧那樣有生存期(棧的元素彈出後就代表生存期結束也就代表釋放了內存)並且要注意的是垃圾回收器只對這塊區域起作用;
然而有些情況下當需要釋放非托管資源時就必須通過寫代碼的方式來解決通常是使用析構函數釋放非托管資源將用戶自己編寫的釋放非托管資源的代碼段放在析構函數中即可需要注意的是如果一個類中沒有使用到非托管資源那麼一定不要定義析構函數這是因為對象執行了析構函數那麼垃圾回收器在釋放托管資源之前要先調用析構函數然後第二次才真正釋放托管資源這樣一來兩次刪除動作的花銷比一次大多的下面使用一段代碼來示析構函數是如何使用的
public class ResourceHolder
{
…
~ResourceHolder()
{
// 這裡是清理非托管資源的用戶代碼段
}
}
四.小結
構造函數與析構函數雖然是一個類中形式上較簡單的函數但它們的使用決非看上去那麼簡單因此靈活而正確的使用構造函數與析構函數能夠幫你更好的理解CLR的內存管理機制以及更好的管理系統中的資源
From:http://tw.wingwit.com/Article/program/net/201311/14870.html