天天看點

《C++程式設計風格(修訂版)》——2.3 實體狀态的一緻性

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

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

在 string 類的第三個構造函數中将對函數的字元串參數進行複制。在這個構造函數中對 s 進 行了初始化,并将 string 對象置于明确定義的狀态,但它對 len 的處理方式與前兩個構造函數是 不一緻的。在前兩個構造函數中,len 是所配置設定的字元數組的長度。而在第三個構造函數中,len 卻是字元串的長度——也就是字元數組的長度減 1。那麼 len 到底應該是動态配置設定數組的長度還 是字元串的長度呢? len 的這兩種含義都是有意義的,但在所有的構造函數及其他的成員函數中, 我們必須隻能使用一種含義。除非 len 的含義是唯一的,否則成員函數将無法以一緻的方式來解 釋 string 對象的狀态。

我們可以在前兩個構造函數中,或者在第三個構造函數中來改正這個問題。通過觀察在最後 一個構造函數(拷貝構造函數)以及成員函數 assign() 和 concat() 中對 len 的使用方式,我們可 以知道 len 的含義究竟是數組的長度還是字元串的長度。現在,我們來依次觀察這三個函數。首先, 在拷貝構造函數中,len 的含義是數組的大小:

《C++程式設計風格(修訂版)》——2.3 實體狀态的一緻性

從拷貝構造函數對 len 的使用方式中,我們可以看到問題是在于第三個構造函數,也就是帶 有字元指針參數的構造函數。其次,在成員函數 assign() 中,len 是被設定為字元串的長度,這卻表明問題是在于前兩個構造函數:

《C++程式設計風格(修訂版)》——2.3 實體狀态的一緻性

最後,在成員函數 concat() 中,情況将變得更糟糕,在這個函數中 len 的使用方式與其他成 員函數中的使用方式都不相同。

一方面,如果 len 是數組的長度,那麼在 concat() 中所配置設定數組的長度就會比所需數組的長 度大 1。另一方面,如果 len 是字元串的長度,那麼在 concat() 中所配置設定數組的長度就會比所需 數組的長度小 1。是以,無論 len 是以上哪種含義,在函數 concat() 中配置設定的數組都存在着多 1 或者少 1 的錯誤。對于這種情況,程式員可能無法決定該如何來使用 len,是以也就無法解決這 個問題。在最初的程式中,string 對象的狀态對于資料成員 len 的含義并沒有一緻的定義。

繼續閱讀