預設建構函式(指沒有參數的建構函式)在C++語言中是一種讓你無中生有的方法。建構函式能初始化對象,而預設建構函式則可以不利用任何在建立對象時的外部資料就能初始化對象。有時這樣的方法是不錯的。例如一些行為特性與數字相仿的對象被初始化為空白值或不確定的值也是合理的,還有比如鏈表、雜湊表、圖等等資料結構也可以被初始化為空白容器。
但不是所有的對象都屬於上述類型,對於很多個物件來說,不利用外部資料進行完全的初始化是不合理的。比如一個沒有輸入姓名的地址簿對象,就沒有任何意義。在一些公司裡,所有的裝置都必須標有一個公司ID號碼,所以在建立對象以模型化一個裝置時,不提供一個合適的ID號碼,所建立的對象就根本沒有意義。
在一個完美的世界裡,無需任何資料即可建立對象的類可以包含預設建構函式,而需要資料來建立對象的類則不能包含預設建構函式。唉!可是我們的現實世界不是完美的,所以我們必須考慮更多的因素。特別是如果一個類沒有預設建構函式,就會存在一些使用上的限制。
請考慮一下有這樣一個類,它表示公司的裝置,這個類包含一個公司的ID代碼,這個ID代碼被強製做為建構函式的參數:
class EquipmentPiece {
public:
EquipmentPiece(int IDNumber);
...
};
因為EquipmentPiece類沒有一個預設建構函式,所以在三種情況下使用它,就會遇到問題。第一中情況是建立數組時。一般來說,沒有一種辦法能在建立對象數組時給建構函式傳遞參數。所以在通常情況下,不可能建立EquipmentPiece對象數組:
EquipmentPiece bestPieces[10]; // 錯誤!沒有正確調用
// EquipmentPiece 建構函式
EquipmentPiece *bestPieces =
new EquipmentPiece[10]; // 錯誤!與上面的問題一樣
不過還是有三種方法能迴避開這個限制。對於使用非堆數組(non-heap arrays)(即不在堆中給數組分配記憶體。譯者注)的一種解決方案是在數組定義時提供必要的參數: