拿了本高階教程第七版的,新書有愛啊,老習慣將目錄和引文遛一邊先。想著還是都翻把,權當複習和學習。
看到建構函式的時候,雖然之前也是理解過的,但看了後感覺還是有必要筆記下這個過程,當是加深記憶和備忘。
這個知識點重要的就是理解建構函式的建立過程。
看例子:
1例子很簡單,結果也很容易猜到。再改下這個列子:class
people26
7class
mm : people815
16}1718
class
program
1926
}
1這樣的話,編譯就出錯了說是:「constructortest.people.people()」不可訪問,因為它受保護級別限制。class
people29
}1011class
mm : people
1219
20}
原因是第5行我將建構函式私有了。
了解類的初始化過程的就很清楚我為什麼要弄這兩個列子,其實重錯誤資訊也可以看出端倪。
我主要就是想說清楚繼承下的多層次結構中物件的初始化過程。
不清楚的看下圖就什麼都清楚了:
當我們執行
1我們知道,建構函式的作用就是在建立例項化物件時初始化自身的資料變數。而上面的例子中,mm在初始化自己的時候會去調他的父類people的構造方法去初始化people,而people要自己又得去調他自身父類的建構函式,這樣一直向上找直到「萬物之源」object。其實這個也挺好理解的,這就是個階級社會,小弟門弄到吃的先給自己的老二,老二自己不敢吃要先給老大,obejct就是老大,他先自己吃飽了(自己初始化了),然後在把剩下的給老二(初始化),老二吃剩的給小弟(初始化)。這個過程是比較好理解的,但是在這個過程中有幾點是需要注意的。mm mmm
=new
mm();
1.若在呼叫父類的建構函式的時候,父類沒有顯式的建構函式可調的時候,編譯器會為其建立預設建構函式(無參空操作),他的作用是將變數賦空值,就像第乙個例子那樣,int型別賦的是0,string的是null。
2.在呼叫的時候,父類若顯式的寫了建構函式,那麼建構函式的訪問級別必須是子類可以訪問到的(即不能為private)。就像第二個例子,去初始mm的時候,由於mm沒有顯式的建構函式,那麼編譯器就會為其建立乙個預設的建構函式,然後他試圖去呼叫父類的無參建構函式,而這時候由於父類已經有了顯式建構函式所以他不會去建立,但這個建構函式卻是private的,子類無法呼叫到,所以在這裡建立過程就失敗了,即出錯了。
3.預設下下列的寫法是等價的,但是對於理解的作用是比較有用的。
1建立過程就是這樣子,明白了後就可以自己控制繼承下多層結構的初始化過程了。class
people212
13}1415
class
mm : people
1623
24public
void
say()
2528
29}
C 拾遺 建構函式 一 預設構造
c 拾遺 建構函式 一 預設構造 對乙個類而言,建構函式恐怕是最重要的乙個成員函式了。關於建構函式的細節繁多,並且隨著新標準的提出,建構函式有了新的特性。本文來集中 下建構函式的那些鮮為人知的一面。建構函式的作用眾所周知 在類的物件被建立時,控制物件的初始化和賦值。建構函式的一般形式 類名 arg ...
C 拾遺系列 3 建構函式
1.主要演示建構函式的繼承 2.靜態建構函式 3.示例 using system using system.collections.generic using system.linq using system.text description 建構函式測試 namespace nettest pub...
C 拾遺系列 3 建構函式
1.主要演示建構函式的繼承 2.靜態建構函式 3.示例 using system using system.collections.generic using system.linq using system.text description 建構函式測試 namespace nettest pub...