預設初始化這是個基礎問題,但往往有些迷惑,尤其是當你同一個時間有時寫Java,有時寫C++ ,總結如下:
C++中基本類型只有作為全域變數才會進行,而對於類類型只要這個類具有一個無參建構函式則不管這個類的對象是局部變數還是全域變數,它都會進行預設的初始化,甚至當一個對象通過預設初始化機制進行建立時,這個對象的類類型資料成員也會根據它們自己的無參建構函式進行預設的初始化。
但是若該類沒有無參建構函式,那麼若這個類沒有任何建構函式,系統將會為這個類提供一個預設的無參建構函式,理論上這個建構函式會講這個類的每個資料成員初始化為釋放類型的0,但是這因編譯器而異,我們最好不要有依賴,系統提供的預設無參建構函式完全有可能只進行記憶體配置而不進行初始化;
若還有其他建構函式,則系統不會提供無參建構函式,此時編譯器編譯不通過,對於這種情況在實際編程中我們可以對其他建構函式之一的所有參數進行預設賦值來彌補。
系統不會提供無參建構函式的另外一個情況是:一個類包含了未初始化的const或引用成員,在這種情況下,我們別無選擇,職能顯式的進行初始化。注意,此時不能在類的內部進行初始化,其實在C++中未有static const類型的資料成員可以進行類內部初始化,除此以外資料成員都不能在類內部進行初始化,但Java並沒有這些限制。
對於這個問題,Java就有一個準則,那就是當一個變數被定義時(而不是只聲明不定義--當然,這種情況只有一個:變數在一個函數內部初次出現,且沒有提供初始值時),它總是預設的初始化為適當類型的0(除非這個變數已經在類定義中有初始值了--再次注意這個在C++中是不可行的)。但和C++不同,Java的一個對象中類類型資料成員的引用不會使用無參建構函式進行預設的初始化,而是簡單的置為null.
最後,要注意的是Java不允許我們為一個函數的參數提供預設值,因為我們再C++中通過給一個常規的建構函式參數提供預設值來達到無參建構函式的方法在Java中無法使用。
對於數組,C++的預設初始化規則如下:
基本類型的數組,若為全域範圍則被預設初始化為適當類型的0,若為局部範圍則不會被預設初始化。
類類型的數組,若作為數組元素的類沒有一個無參建構函式(此時定義了一個或多個其他的建構函式,系統因此也不會提供預設無參建構函式了),則該數組無法聲明;若有一個程式員顯式提供的無參建構函式則會進行初始化;若有一個系統提供的隱式無參預設初始化建構函式則在全域範圍上才會初始化。
而在Java中C++的數組初始化問題是不存在的,數組的各個元素都會自動進行初始化,類類型對象的數組元素將初始化為null.