類的預設建構函式是無參建構函式,子類繼承父類時需要首先呼叫父類建構函式,所以當父類函式中定義了有參建構函式後,子類必須呼叫base呼叫父類的建構函式。
建構函式是在建立給定型別的物件時執行的類
方法。建構函式具有與類相同的名稱,它通常初始化新物件的資料成員。
在下面的示例中,定義了乙個具有乙個簡單的建構函式,名為 taxi 的類。然後使用 new
運算子來例項化該類。在為新物件分配記憶體之後,new運算子立即呼叫 taxi 建構函式。
c#
publicclass taxi
}class testtaxi
}
不帶引數的建構函式稱為「預設建構函式」。無論何時,只要使用new運算子例項化物件,並且不為new提供任何引數,就會呼叫預設建構函式。有關更多資訊,
除非類是 static
的,否則 c# 編譯器將為無建構函式的類提供乙個公共的預設建構函式,以便該類可以例項化。有關更多資訊,請參見靜態類和靜態類成員
。 通過將建構函式設定為私有建構函式,可以阻止類被例項化,如下所示:
c#
class nlog
public
static double e = system.math.e;
}
結構型別的建構函式與類的建構函式類似,但是structs不能包含顯式預設建構函式,因為編譯器將自動提供乙個建構函式。此建構函式將結構中的每個字段初始化為預設值表
中顯示的預設值。然而,只有當結構用new例項化時,才會呼叫此預設建構函式。例如,下面的**使用 int32
的預設建構函式,因此您可以確信整數已初始化:
int i = new int();console.writeline(i);
然而,下面的**卻導致了編譯器錯誤 cs0165
,因為它沒有使用new,而且試圖使用尚未初始化的物件:
複製**
int i;console.writeline(i);
基於structs的物件可以初始化或賦值後使用,如下所示:
複製**
int a = 44; // initialize the value type...int b;
b = 33; // or assign it before using it.
console.writeline(", ", a, b);
因此對值型別呼叫預設建構函式不是必需的。
類和structs都可以定義具有引數的建構函式。帶引數的建構函式必須通過new語句或 base
語句來呼叫。類和structs還可以定義多個建構函式,並且二者均不需要定義預設建構函式。例如:
c#
複製**
publicclass employee
public employee(int weeklysalary, int numberofweeks)
}
此類可以使用下列語句中的任乙個來建立:
c#
複製**
employee e1 = new employee(30000);employee e2 = new employee(500, 52);
建構函式可以使用base關鍵字來呼叫基類的建構函式。例如:
c#
複製**
publicclass manager : employee
}
在此示例中,基類的建構函式在執行建構函式塊之前被呼叫。base關鍵字可帶引數使用,也可不帶引數使用。建構函式的任何引數都可用作base的引數,或用作表示式的一部分。有關更多資訊,請參見 base
。在派生類中,如果不使用base關鍵字來顯式呼叫基類建構函式,則將隱式呼叫預設建構函式(如果有的話)。這意味著下面的建構函式宣告在效果上是相同的:
c#
複製**
public manager(int initialdata)
c#
複製**
public manager(int initialdata) : base()
如果基類沒有提供預設建構函式,派生類必須使用base顯式呼叫基建構函式。
建構函式可以使用 this
關鍵字呼叫同一物件中的另一建構函式。和base一樣,this可帶引數使用也可不帶引數使用,建構函式中的任何引數都可用作this的引數,或者用作表示式的一部分。例如,可以使用this重寫前一示例中的第二個建構函式:
c#
複製**
public employee(int weeklysalary, int numberofweeks): this(weeklysalary * numberofweeks)
上面對this關鍵字的使用導致此建構函式被呼叫:
c#
複製**
public employee(int annualsalary)
建構函式可以標記為 public
、private
、protected
、internal
或protectedinternal。這些訪問修飾符定義類的使用者構造該類的方式。有關更多資訊,請參見訪問修飾符
。使用 static
關鍵字可以將建構函式宣告為靜態建構函式。在訪問任何靜態字段之前,都將自動呼叫靜態建構函式,它們通常用於初始化靜態類成員。有關更多資訊,請參見靜態建構函式。
建構函式的繼承
在父類中定義了2個建構函式,在子類中,也定義了2個建構函式。當執行子類時,可以發現先呼叫父類的建構函式,在呼叫子類的建構函式。實驗四 建構函式的繼承 實驗內容 在父類中,定義了2個建構函式,在子類中,也定義了2個建構函式。編寫 程式顯示父類 子類建構函式的呼叫過程,在子類中實現建構函式的繼承。pac...
建構函式的繼承
物件之間的 繼承 有五種方法。比如,現在有乙個 動物 物件的建構函式。function animal 還有乙個 貓 物件的建構函式。function cat name,color 怎樣才能使 貓 繼承 動物 呢?一 建構函式繫結 function cat name,color var cat1 ne...
C 建構函式的繼承
一 基類沒有定義建構函式的情況 1 派生類也可以不定義建構函式,全部採用預設的建構函式,此時,派生類新增成員的初始化工作可以用其他公有函式來完成。2 如果只有派生類定義建構函式,只需要構造派生類物件即可,物件的基類部分使用預設建構函式來自動建立 二 基類中存在建構函式 1 基類中存在不帶引數的建構函...