《C 沉思錄》筆記 類設計者核查表

2021-08-22 11:09:37 字數 1857 閱讀 5902

類設計者的核查表

1. 類需要建構函式麼?

2. 資料是否需要保持私有的?

方案一public:

int length;

方案二public:

const int& length;//在建構函式中length = true_length;這樣由於是const變數,只能讀,不能修改。

private:

int true_length;

方案**ublic:

int length() const;//

3. 是否需要乙個無參的建構函式?

如果沒有無參的建構函式,那麼

point p;

point pa[100];

這樣的定義都是錯誤的。

4. 是不是每個建構函式初始化所有的資料成員?

建構函式的用途就是用一種明確定義的狀態來設定物件,而這個物件是由物件的資料成員反映的。

因此每個建構函式都要負責為所有資料成員設定明確定義的值。(特殊的例外)

5. 是否需要析構函式?

如果有記憶體是在類中new出來,但一直也沒有釋放的,需要在析構函式中釋放掉。

6. 是否需要虛析構函式?

如果乙個基類b被派生了乙個子類d,無論b是否有虛函式

b* d = new d();

delete d;  //b都需要虛析構函式,否則這裡會呼叫錯誤的析構函式

7. 是否需要複製建構函式?

因為data的記憶體是另外動態分配的。所以應該需要析構函式來釋放data空間

class string

因為data的記憶體是另外動態分配的。所以應該需要析構函式來釋放data的空間。

同樣也需要複製建構函式,因為如果沒有的話,如果複製物件

string b = a

就是僅複製data的位址,b.data和a.data指象同乙個記憶體,在兩個物件銷毀時,這個記憶體會被釋放兩次。

如果不希望使用者能夠複製類的物件,就宣告複製建構函式(可能還有賦值操作符)為私有的

class thing

8. 需要乙個賦值操作符麼?

是否需要的理由和複製建構函式是一樣的。

thing& operator=(const thing&);

由return *this;結束以保證與內建的複製操作符一致。

寫這個函式的時候還要注意賦值給自身的情況

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

所以最好:

string& string::operator=(const string& s)}或:

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

9. 需要定義關係操作符麼?

如果類邏輯上支援相等操作,那麼提供operate==,operate!=,就可能有好處

如果類的值有某種排序關係,那就考慮其他 < > 等操作符

10. 刪除資料用delete了麼?

刪除陣列是用delete是個好習慣。這種用法是為了與c相容,實現時會有個地方記錄陣列的長度

11. 記得在複製建構函式和賦值操作符的引數型別中加const了麼?

x::x(const x&)

x::operator=(const x&)

12. 如果函式有引用引數,它們應該是const引用麼?

complex operator+(const complex& x,const complex& y);

13. 記得適當地宣告成員函式為const了麼?

如果乙個成員函式不會修改其物件(一般get方法),可以宣告它為const,這樣它才可以應用於const物件。

例如:int padded_length(const vector& v,int n)

類設計者的核查表 c 沉思錄筆記

類的設計時需要弄清楚一些問題,這些問題沒有確切的答案,關鍵是要思考他們,並確認你所作的事情是處於有意識的決定。主要從類的建構函式 析構函式 複製建構函式和賦值操作符 資料成員及const修飾成員函式等五個方面來考慮。1 類的建構函式 類的建構函式主要從是否需要建構函式 是否需要無參的建構函式 是不是...

類設計者的核查表

1,你的類需要乙個建構函式嗎?2,你的資料成員是私有的嗎?3,你的類需要乙個無參建構函式嗎?4,是不是每個建構函式初始化所有的資料成員嗎?5,類需要析構函式嗎?6,類需要乙個虛析構函式嗎?7,你的類需要複製建構函式嗎?8,你的類需要乙個賦值操作符嗎?9,你的類需要定義關係操作符嗎?10,你的類需要定...

類設計者的核查表

核查表不是任務清單。它的用途是幫你回憶起可能會忘掉的事情,而不是約束你。下面的問題沒有確切的答案,關鍵是要提醒你思考他們,並確認你所做的事情是出於有意識的決定,而不是偶然行為。你的類需要乙個建構函式碼?基本上是 你的類成員是私有的嗎?你的類需要乙個無參的建構函式碼?是不是每個建構函式初始化所有資料成...