設計乙個類的時候,需要考慮的問題:
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,你的類需要定...