類設計者checkList
- 類需要構造函數(shù)嗎荣回?
需要通過構造函數(shù)隱藏內(nèi)部工作方式的才需要提供構造函數(shù)吸奴。 - 類需要私有成員嗎隐绵?
提供私有成員的好處是:外部只能通過成員函數(shù)進行訪問洞坑;私有成員的變化可以被類迅速感知盲链。 - 類需要提供無參構造函數(shù)嗎?
提供無參構造函數(shù)可以不用顯示的初始化迟杂,example:T t;
提供無參構造函數(shù)可以定義該類型的數(shù)組刽沾,example: T t[100];
- 類的構造函數(shù)需要初始化全部的成員嗎?
一般構造函數(shù)需要明確的初始化成員逢慌,為對象確立明確的狀態(tài)悠轩。但是有些屬性僅在對象存在一段時間以后才會有意義。針對這個問題沒有明確的答案攻泼。這個問題是為了我們設計類的時候進行思考。 - 類需要析構函數(shù)嗎鉴象?
明確一點就可以:這個類的對象是否持有某些資源忙菠,這些資源并不會在成員函數(shù)中自動申請和釋放,此時需要設計析構函數(shù)纺弊。 - 類的析構函數(shù)需要virtual關鍵字修飾嗎牛欢?
如果該類不會被用作基類,或者不存在通過基類的指針指向派生類對象或者引用派生類對象的場景下才不需要虛析構函數(shù)淆游。 - 類需要復制構造函數(shù)嗎傍睹?
復制構造函數(shù):
Type(const Type& other) {
// init members here!
}
如果類包含某些申請的資源的指針或者handle,就會出現(xiàn)按照c++默認復制構造策略產(chǎn)生的對象包含了指向同一資源的指針或者handle犹菱,會產(chǎn)生多次釋放的問題拾稳。因此需要提供一個復制構造函數(shù)。
- 類需要重載賦值運算符嗎腊脱?
一般提供了復制構造函數(shù)以后也需要提供operator=的重載访得。 - 類的賦值操作符能否正確的將對象本身賦值給對象本身?
錯誤的做法是沒有判斷賦值運算的other和this是不是同一個對象陕凹,如果是同一個對象的情況悍抑,先釋放在拷貝會出現(xiàn)還沒有拷貝就已經(jīng)把原來的對象銷毀了鳄炉。
// 正確的實現(xiàn)
Type& operator=(const Type& other) {
// 1. check is other and *this the same?
if(&other != this) {
// 2. do the assignment
// delete the resource and make a copy by creating a new one
}
return *this;
}
或者采用先復制到臨時變量,然后在銷毀原有對象搜骡,最后在復制回去的方式拂盯。
- 類需要定義關系運算嗎?類需要定義算數(shù)運算符嗎记靡?
如果類的對象需要比較大小谈竿,判斷相等等操作,則需要定義關系運算符簸呈。
如果類的對象需要進行自增榕订,自減,+=和-=等操作蜕便,則需要定義算數(shù)運算符劫恒。 - 刪除數(shù)組時是否正確的使用了delete [] ?
delete [] pointer;
- 類的復制構造函數(shù)轿腺,賦值操作符的參數(shù)都加上
const
的修飾了嗎两嘴?
被復制的參數(shù)不應該被改變。 - 如果成員函數(shù)的參數(shù)有引用族壳,是否應該加上
const
修飾憔辫?
如果希望修改參數(shù),則不應該加上const
修飾符仿荆,否則應該加上贰您。 - 記得適當聲明成員函數(shù)為
const
的了嗎?
確定不改變對象狀態(tài)的成員函數(shù)應該被聲明為const
拢操,否則不能將該成員函數(shù)應用于const
修飾的對象和引用锦亦。
總結
這份問題清單的目的是提醒我在設計一個類的時候,應該按照這個checkList進行思考令境,避免出現(xiàn)一些意外的情況杠园。
還一個功能就像書里面說的一樣,是為幫助我們回憶起可能忘掉了的事情舔庶,對設計的類進行例行檢查抛蚁。