天天看點

《C++程式設計風格(修訂版)》——2.2 明确定義的狀态

本節書摘來自異步社群出版社《c++程式設計風格(修訂版)》一書中的第2章,第2.2節,作者:【美】tom cargill,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++程式設計風格(修訂版)

在 string 類的前兩個構造函數中存在着同樣的問題。

《C++程式設計風格(修訂版)》——2.2 明确定義的狀态

如果在建立 string 對象時調用了上述兩個構造函數之一,那麼這個 string 對象的初始狀态将 是未定義的。在下面的代碼中将輸出兩個字元串,其中在建立 string 對象時分别調用了上面兩個 構造函數。

《C++程式設計風格(修訂版)》——2.2 明确定義的狀态

對 x 和 y 來說,調用函數 print() 的結果是未定義的,因為由 x.s 和 y.s 指向的字元數組中的 内容是未定義的。在這兩個構造函數中,都為字元數組配置設定了記憶體,但卻沒有對配置設定的記憶體進行 初始化。流輸出對象 cout 将持續輸出字元,直到在記憶體中遇到第一個空字元( 0 )才停止輸出。

構造函數的目的是為了初始化對象,是以一個構造函數至少應該使對象處于明确定義的狀态。

構造函數應該使得對象處于明确定義的狀态。

在 string 類的前兩個構造函數中,對初始狀态的穩妥處理就是使用空字元串,即 s[0] 應該被 設定為空。

對于這兩個構造函數,我們還可以作一個改進,不過這個改進略顯次要。這兩個構造函數 的功能幾乎是等價的:在每個構造函數中都配置設定了一個字元數組,并将指向數組記憶體的指針儲存在 s 中,以及将數組的長度儲存在 len 中。二者唯一的差別就是其中一個構造函數使用了預設值 來指定數組的大小,而另一個構造函數則使用參數值來指定數組的大小。除此之外,這兩個函數 都是相同的。是以,我們可以有更好的選擇,即使用帶有預設參數值的構造函數。通過用下面的 構造函數來代替前面兩個構造函數,就可以改正到目前為止所遇到的兩個問題:

《C++程式設計風格(修訂版)》——2.2 明确定義的狀态

通常來說,用預設參數的形式來代替函數重載的形式,可以使程式更加易于維護,因為此 時程式中将隻會存在一個函數體。在本示例程式中,我們對構造函數采用了函數重載的形式。對 于其他的成員函數或者非成員函數,這個規則同樣适用。

考慮使用預設參數的形式來代替函數重載的形式。

繼續閱讀