C 沉思錄讀書筆記1 如何定義乙個完整的類

2021-04-06 21:40:49 字數 1965 閱讀 6630

c++沉思錄(ruminations on c++)讀書筆記1.如何定義乙個完整的類

c++ 哲學:只為用到的東西付出代價

定義乙個類時必須搞清楚的幾個問題:

需要建構函式嗎?

如果答案為 no,那麼很可能你需要定義的只是乙個結構,而不是乙個類,因為建構函式的用途是用一種明確定義的狀態來設定物件。

資料成員是私有的嗎?

一般來說,如果資料成員為公有,你很難控制這些成員何時被訪問。

需要乙個無引數的建構函式嗎?

如果乙個類已經有了建構函式,而你想宣告該類的物件時不必顯示地初始化它們,則必須顯示地寫乙個無引數的建構函式。(特別是當你需要生成這個類的物件陣列時!)

每個建構函式是否都對所有資料成員進行了初始化了?

物件的狀態由物件的資料成員反映,因此每個建構函式都有負責為所有的資料成員設定經過明確定義的值。如果某個建構函式沒有做到這一點,就很可能導致錯誤。(當然,這種說法未必總是正確的。因為有時,某些資料成員,只有在該物件存在了一定的時間後才有意義。)

需要析構函式嗎?

並不是所有的類都需要析構函式的。一般來說,如果乙個類分配了資源,並且這些資源不會被成員函式自動釋放,那麼這個類就需要乙個析構函式。

需要乙個虛析構函式嗎?

任何不作為基類的類是不需要虛析構函式的,虛析構函式只有在繼承的情況下才有用。當可能發生 delete 乙個型別為基類的指標,可實際上該指標代表的是乙個子類的物件,這個基類定義時需要乙個虛析構函式。

需要乙個複製建構函式嗎

如果用類預設的複製建構函式複製該類的物件時,如果能完整複製該類的資料成員和基類物件,就不需要複製建構函式,否則就需要。特別是,如果你的類在建構函式內分配了資源,或者在成員函式中分配了資源,則很可能需要乙個顯示的複製建構函式來管理資源。有析構函式(除了空的析構函式外)的類通常是用析構函式來釋放資源,這通常也說明需要乙個複製建構函式。

需要乙個賦值操作符嗎?

如果你的類需要複製建構函式,多半也需要乙個賦值操作符。當然,如果你不想使用者設定類中的物件,可以將賦值操作符宣告為私有的。

賦值操作符能正確地將物件賦給物件本身嗎?

自我賦值是常犯的錯誤!賦值總是用新值取代目標物件的舊值。如果原物件和目標物件是同乙個,而我們又奉行「先釋放舊值,再複製新值」的原則,那麼就可能在還沒有實施複製之前就把原物件銷毀了!

需要定義關係操作符嗎?

如果你的類需要放入 stl 的容器中,很可能需要定義關係操作符。把乙個新物件加入容器中,某些容器,需要把新物件與容器裡已有的物件進行比較,比如進行相等比較,進行大小比較。因此,如果類邏輯上支援相等操作,那麼提供 operator== 和 operator!= 就會很有好處。類似,如果類的值有某種排序關係,你就可以提供 operator< 或者 operator> 等關係操作符。只要這些容器需要建立你的類的有序集合,你就必須提供關係操作符。

刪除陣列時記住用 delete 了嗎?

在刪除任何型別的陣列時使用 delete 是一種很好的習慣。

在複製建構函式和賦值建構函式的引數型別中加上 const 了嗎?

這是某些 c++ 著作中也會犯的錯誤!

如果函式有引用引數,只有在函式想改變函式的輸入引數時,才應該不用 const 宣告該引用引數!通常這個會被改變的輸入引數也肩負著輸出引數的角色。

記得適當地宣告成員函式為 const 了嗎?

如果確信乙個成員函式不用修改它的物件,就可以宣告它為 const。

乙個需要上述所有特性類定義的例子

// 宣告

class a;

// 實現

a::a()

a::~a()

a::a(const a& s)

a& a::operator=(const a& s)

return *this;

}bool a::operator==(const a& s) const

bool a::operator!=(const a& s) const

bool a::operator<(const a& s) const

C 沉思錄讀書筆記(三)

乙個物件導向的程式範例 物件導向程式設計的3個要素 資料抽象 繼承及動態繫結。這個例程非常完整的展示了這3個要素。程式要做的內容就是要將這個算術表達樹輸出,即得到 5 3 4 expressions標頭檔案 ifndef expression h h define expression h h in...

C 沉思錄讀書筆記(17章) 見識泛型演算法的威力

在這回的學習中,我們能體會到泛型演算法的威力,這是通過模板 抽象 實現的 泛型演算法是一種用對其所用的資料結構進行盡可能少的假設的方法表達的演算法,模板使得泛型 genericity 更為容易 首先來看乙個簡單的例子,假設我們想找整形陣列中第乙個等於某個給定值的元素,很簡單,如下 const int...

沉思錄一 如何維護乙個複雜的網路應用

寫下這個文章的時候,剛從乙個複雜的linux服務端網路應用專案中脫出,除去身心的疲憊不堪後,不得不反思標題中的問題,如何破局?這樣在下次面對相似問題時,可能就多幾分倖存的機率。最想知道我是在什麼地方死的,這樣我就可以避開死亡了。這個是查理芒格多次講過的話。但是很多人被困難問題擊敗後,都沒有找到自己是...