類的設計時需要弄清楚一些問題,這些問題沒有確切的答案,關鍵是要思考他們,並確認你所作的事情是處於有意識的決定。
主要從類的建構函式、析構函式、複製建構函式和賦值操作符、資料成員及const修飾成員函式等五個方面來考慮。
1、類的建構函式
類的建構函式主要從是否需要建構函式、是否需要無參的建構函式、是不是每個建構函式初始化所有的資料成員3個方面來核查。
(1)、是否需要類的建構函式:有些類太簡單,它們的結構就是它們的介面,所以不需要建構函式。建構函式是用來隱藏足夠負責類的內部工作方式。
(2)、是否需要無參建構函式:如果類有了建構函式,你想宣告該類的物件可以不必顯式的初始化它們,則必須顯式的寫乙個無參建構函式。
x x; x x[100];
(3)、是不是每個建構函式初始化所有的資料成員:建構函式的用途是用一種明確的狀態來設定物件。物件的狀態由物件的資料成員進行反映。因此每個建構函式都要負責
為所有的資料成員設定經過明確定義的值,如果沒有,可能導致錯誤;當然,有時,類會有一些資料成員,它們只在它們的物件存在了一定時間之後才有意義。思考
這 點能促進你對自己設計類的了解。
2、類的析構函式
類的析構函式主要考慮是否需要析構函式、析構函式是虛的嗎。
(1)、是否需要析構函式:問一問該類是否分配了資源,而這些資源又會不會由成員函式自動釋放,特別是哪些建構函式裡包含了new表示式的類,通常要在析構函式中加上相應的delete表示式,所以需要乙個析構函式。
(2)、類的析構函式是虛的嗎:有些類需要虛析構函式只是為了宣告它們的析構函式是虛的,決不會用作基類的類是不需要虛析構函式的。任何虛函式只有在繼承的情況下才有用。在繼承情況下,用基類的指標指向繼承類的物件,對這個指標進行delete時,你就需要給基類加上虛析構函式。虛析構函式通常是空的。
3、類的複製建構函式和賦值操作符
類的複製建構函式和賦值操作符經常放在一起考慮,因為它們實現的功能很相似,複製建構函式在類的物件宣告時並初始化呼叫,賦值操作符在類的物件宣告後進行賦值呼叫。
主要考慮是否需要複製建構函式和賦值操作符、賦值操作符能正確的將物件賦值給物件本身嗎、複製建構函式和賦值操作符的引數型別中加上const了嗎。
(1)、類是否需要複製建構函式和賦值操作符:關鍵在於複製該類的物件是否相當於複製其資料成員和基類物件,如果並不相當,就需要複製建構函式。如果你的類在構造
函式分配了資源,則可能需要乙個顯式的複製建構函式來管理資源。有析構函式(除了空的虛析構函式)的類通常用析構函式來釋放建構函式分配的資源,這也通常說明需要乙個複製建構函式。如果需要複製建構函式,同理多半也會需要賦值操作符。如果不想使用者能夠複製類的物件,就宣告類的複製建構函式和賦值操作符為私有的。
(2)、賦值操作符能正確的將物件賦值給物件本身嗎:賦值總是用新值取代目標物件的舊值。我們奉行的是「先釋放舊值,再複製」的行事規程,那麼就可能在還沒有實施複製之前就把原物件銷毀了。
(3)、複製建構函式和賦值操作符的引數型別上加上了const了嗎:畢竟複製物件不會改變原物件,實際上,由於繫結乙個非const引用到乙個臨時物件是非法的,使用非const引用引數的複製建構函式不會允許複製特殊表示式的結果,同理適用於賦值操作符。
4、類的資料成員
類的資料成員最初級的考慮是是否是私有的。就是考慮封裝。
5、其他
這些考慮的內容比較雜,無法用const修飾成員函式來概括。它有四個點:類是否需要定義關係操作符、刪除陣列是否用delete、成員函式有引用引數,是否應該是const引用、是否需要宣告成員函式為const。
(1)、類是否需要定義關係操作符:c++支援模板,通用庫中包含容器類,有些容器依賴於它們所包含的元素型別的操作。通常要求容器能夠判斷兩個值是否相等,還常常需要容器具有判斷乙個值是否大於或者小於另乙個值的能力。即使不希望使用者直接使用操作符,也可能需要這些關係操作符,只要它們想建立你的型別的有序集合,你就必須提供關係操作符。
(2)、刪除陣列是否用delete。
(3)、成員函式有引用引數,是否應該是const引用:只有當函式想改變引數時,它才應該有不用const宣告的引用引數。考慮x+y的結果不是左值,不能繫結乙個非const引用到自身,所以類似x+y+z的表示式就變得不可能了。
(4)、是否宣告成員函式為const:如果確信乙個成員函式不用修改它的物件,就可以宣告它為const,這樣就把它用於const物件了。
《C 沉思錄》筆記 類設計者核查表
類設計者的核查表 1.類需要建構函式麼?2.資料是否需要保持私有的?方案一public int length 方案二public const int length 在建構函式中length true length 這樣由於是const變數,只能讀,不能修改。private int true leng...
類設計者的核查表
1,你的類需要乙個建構函式嗎?2,你的資料成員是私有的嗎?3,你的類需要乙個無參建構函式嗎?4,是不是每個建構函式初始化所有的資料成員嗎?5,類需要析構函式嗎?6,類需要乙個虛析構函式嗎?7,你的類需要複製建構函式嗎?8,你的類需要乙個賦值操作符嗎?9,你的類需要定義關係操作符嗎?10,你的類需要定...
類設計者的核查表
核查表不是任務清單。它的用途是幫你回憶起可能會忘掉的事情,而不是約束你。下面的問題沒有確切的答案,關鍵是要提醒你思考他們,並確認你所做的事情是出於有意識的決定,而不是偶然行為。你的類需要乙個建構函式碼?基本上是 你的類成員是私有的嗎?你的類需要乙個無參的建構函式碼?是不是每個建構函式初始化所有資料成...