繼承的建構函式的知識遺漏

2021-05-28 02:35:38 字數 3239 閱讀 1642

類的預設建構函式是無參建構函式,子類繼承父類時需要首先呼叫父類建構函式,所以當父類函式中定義了有參建構函式後,子類必須呼叫base呼叫父類的建構函式。

建構函式是在建立給定型別的物件時執行的類

方法。建構函式具有與類相同的名稱,它通常初始化新物件的資料成員。

在下面的示例中,定義了乙個具有乙個簡單的建構函式,名為 taxi 的類。然後使用 new

運算子來例項化該類。在為新物件分配記憶體之後,new運算子立即呼叫 taxi 建構函式。

c#

public

class 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#

複製**

public

class employee

public employee(int weeklysalary, int numberofweeks)

}

此類可以使用下列語句中的任乙個來建立:

c#

複製**

employee e1 = new employee(30000);

employee e2 = new employee(500, 52);

建構函式可以使用base關鍵字來呼叫基類的建構函式。例如:

c#

複製**

public

class 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 基類中存在不帶引數的建構函...