建構函式雜談

2022-02-06 05:52:00 字數 2301 閱讀 5207

建構函式是在例項化物件時自動呼叫的函式。它們必須與所屬的類同名,且不能有返回值。類或結構可能有多個接受不同引數的建構函式。建構函式使得我們可設定預設值、限制例項化以及編寫靈活且便於閱讀的**。

如果您沒有為物件提供建構函式,則預設情況下 c# 將建立乙個建構函式,該建構函式例項化物件,並將成員變數設定為 default values table (c# reference)中列出的預設值。 靜態類和結構也可以有建構函式。

介紹建構函式、靜態建構函式、在建構函式中呼叫其他建構函式以及建構函式在派生類中的應用。

public class 

useraccessor

}

上面就是乙個最簡單的建構函式,可以看出該建構函式滿足概述中所述的建構函式條件,在例項化useraccessor類時,就執行useraccessor()方法中的**,在這裡我們可以寫下自定義的**,如給字段賦值等。 

public class 

usermodel

}

在例項化usermodel類時,我們就需要使用usermodel usermodel = new usermodel("useriddemo");例項化時必須傳入制定的引數,這樣就可以在例項化時儲存於該例項相關的資料。 

如非必要我們可以不向乙個類提供建構函式,編譯器會在後台建立乙個預設的建構函式。但如果提供了自定義的建構函式,編譯器就不會提供預設的建構函式。 

建構函式的過載和普通的函式過載遵循相同的規則,可以為函式提供任意多的建構函式過載,只要它們滿足過載的條件即可。 

除了public外,可以設定建構函式的修飾符為private及protected,若設定為private,則該類不能用這個建構函式來例項化;若設定為protected,則該類只能在派生類中用該建構函式例項化。

但是可以通過使用公用方法、屬性的包裝,來實現例項化,單例模式即是該特性的乙個使用場景。 

c#可以給類編寫無引數的靜態建構函式,這種建構函式只執行一次,但.net執行庫並沒***靜態建構函式在什麼時候執行,它通常在第一次呼叫類的成員之前執行。

編寫靜態建構函式的乙個原因是,類中有一些靜態欄位或屬性,需要在第一次使用類之前從外部源中初始化這些靜態欄位和屬性。

靜態建構函式沒有訪問修飾符,因為其他c#**從來不呼叫它,所以給它設定修飾符是毫無意義的。

靜態建構函式可以和無引數的例項建構函式安全共享。雖然他們的函式簽名一樣。 

public class 

usermodel

public usermodel(string

userid, string

username)

: this(userid)

}

上面的**中帶有兩個引數的建構函式後新增了: this(userid)**,這樣就實現了呼叫帶有乙個引數的建構函式的方法。

這種方法叫建構函式的初始化器,:this表示呼叫本類的建構函式,userid為引數,這樣編譯器就會呼叫那個和這個引數最匹配的建構函式。

那這兩個建構函式的執行順序是怎樣的?若按上面的**,則是先執行有乙個引數的建構函式,然後再執行有兩個引數的建構函式。 

上面介紹的都是單個類的建構函式,在有繼承層次的的類中,建構函式有一些特殊的特性。看如下兩個類:

public class 

user

}public class

adminuser : user

}

若我們使用adminuser的無參建構函式例項化adminuser,此時user的無參建構函式會被呼叫嗎?

答案是,肯定會的。

用這種方法例項化adminuser時,編譯器會首先找到adminuser的建構函式,然後再嘗試找到它的基類user的建構函式,然後再找到user類的基類object的建構函式。

因為object沒有基類,所以編譯器就執行object的建構函式,然後再執行user類的建構函式,最後再執行adminuser的建構函式。整個過程如下圖所示:

在程式中要注意這個順序,正確理解繼承關係中各個類的構造函式呼叫情況。 

上面的示例中我們呼叫的是基類預設的無參建構函式,若想在子類中呼叫基類的有參建構函式,該怎麼做?看如下**:

public class 

adminuser : user

}public class

user

}

其呼叫方法和呼叫本類內建構函式的方法基本相同,只是將this換成了base。需要注意的是,子類必須有訪問基類相應建構函式的許可權,即基類的建構函式設定了合適的修飾符。

演算法雜談 構造數獨

數獨描述 在9 9的格仔內,填入1 9,要求每一行每一列不能有重複數,並且,每個格仔所處的3 3格仔內不得有重複數。分析 這是乙個典型的遞迴回溯演算法,本例中用乙個except 9 9 9 的陣列來構造每個格仔的禁忌表 就是該格仔中不能填入的數 用變數hs來表示此次填數是向前遞迴運算還是回溯運算。如...

OPENCV函式雜談

並不是所有格式的mat型資料都能被使用儲存為,目前opencv主要只支援單通道和3通道的影象,並且此時要求其深度為8bit和16bit無符號 即cv 16u 所以其他一些資料型別是不支援的,比如說float型等。convertto 函式負責轉換資料型別不同的mat,即可以將類似float型的mat轉...

建構函式 拷貝建構函式 賦值建構函式

class和struct很大乙個區別在於,c除了成員的訪問控制許可權,struct中的成員預設是public,而class中的field預設是private class還有乙個special的地方是它有建構函式 constructor。建構函式是class中的一員,和成員變數 其他成員函式一起構成乙...