《C 沉思錄》 第四章 類設計者的核查表

2021-06-19 14:25:43 字數 2802 閱讀 2351

設計乙個類的時候,需要考慮的問題:

1、你的類需要乙個建構函式嗎?

可能需要乙個建構函式來隱藏內部工作方式。

2、你的資料成員是私有的嗎?

保證資料的實時性,有效性。比如長度,如果是共有的,被修改了,就不能正確的表達原先所謂的「長度」。

3、你的類需要乙個無參建構函式嗎?

沒有的話,等於禁止了物件陣列。

class point

//...

private:

int x, y;

};point p; //error

point pa[100]; //error

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

每個建構函式都要負責為所有的資料成員設定經過明確定義的值。但也未必。

5、類需要析構函式嗎?

類是不是分配了資源,而又不能由成員函式自動釋放。

特別是的建構函式裡包含了new表示式的類,通常要在析構函式中delete掉。

6、類需要乙個虛析構函式嗎?

決不會作為基類的類是不需要虛析構函式的:任何虛函式只有在繼承的情況下才有用。

虛析構函式通常是空的。

struct b

};struct d : b

;int main()

7、你的類需要複製建構函式嗎?

關鍵在於複製該類的物件是否就相當於複製該資料成員和基類物件。

如果你的類在建構函式內分配資源,則可能需要乙個顯示的複製建構函式來管理資源。

有析構函式(除了空的虛析構函式外)的類通常是用析構函式來釋放建構函式分配的資源。

如果不想使用者能夠複製類的物件,就宣告複製建構函式為私有的。

8、你的類需要乙個賦值操作符嗎?

如果需要複製建構函式,同理多半也會需要乙個複製操作符。

如果不想使用者能夠設定類中的物件,就將賦值操作符私有化。

類x的輔助由x::operator=來定義。通常,operator=應該返回乙個x&,

並且由 「return *this;」 結束,來保證與內建的複製操作符一致。

9、你的複製操作符能正確地將物件賦給物件本身嗎?

思考一下類他string:

#include #include using namespace std;

class string

;

我們很容易就用下面的方法來實現賦值:

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

可是一旦我們把乙個string物件賦值給它本身,那就會徹底失敗。

因為s和*this都是指向同乙個物件。

//正確的實現方法1

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

return *this;

}

//正確的實現方法2

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

10、你的類需要定義關係操作符嗎?

只要使用者想建立你的型別的有序集合,你就必須提供關係操作符。

11、刪除陣列時你記得用delete[ ]嗎?

12、記得複製建構函式和賦值操作符的引數型別中加上const了嗎?

類x的複製建構函式應該類似: x::x(const x&)。

賦值應該類似:x::operator=(x&)。

13、如果函式有引用引數,他們應該是const引用?

只有當函式想改變引數時,它才應該有不用const宣告的引用引數。

所以,例如,不應該用

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

而應該用

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

除非你想允許增加兩個complex物件來改變他們的

值!否則,由於x+y不是左值,只是乙個零時物件,就不能繫結乙個非const引用到本身,

只能將其辦定到const物件的引用上。

所以類似於x+y+z的表示式就不可用了。

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

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

這樣就把它用於const了。

//錯誤**1

#include using namespace std;

class pen

int length()

private:

int length;

};int main()

error: passing 'const pen' as 'this' argument of 'int pen::length()' discards qualifiers [-fpermissive]

//正確**2

#include using namespace std;

class pen

int length() const

int lenght()

private:

int length;

};int main()

//length of p1 : 10

//length of p2 : 10

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

類設計者的核查表 1.類需要建構函式麼?2.資料是否需要保持私有的?方案一public int length 方案二public const int length 在建構函式中length true length 這樣由於是const變數,只能讀,不能修改。private int true leng...

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

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

類設計者的核查表

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