去同學(xué)那玩,看到這么一本書《C++沉思錄》。這本書很早聽過,但是沒有讀過。于是捧起書讀了幾章,感覺很是不錯。其中第四章就是講“類設(shè)計者的核查表”。雖然用c++有幾年,但是有一些東西還是需要銘記于心的。
類設(shè)計者的核查表
一、
您的類需要一個構(gòu)造函數(shù)么?
有些類太簡單,無需構(gòu)造函數(shù),但有些類太復(fù)雜,他們需要構(gòu)造函數(shù)來隱藏它們的內(nèi)部工作方式。
二、
您的數(shù)據(jù)成員是私有的么?
通常使用公有的數(shù)據(jù)成員不是什么好事,因為類設(shè)計者無法控制何時訪問這些成員。
三、
您的類需要一個無參的構(gòu)造函數(shù)么?
如果一個類已經(jīng)有了構(gòu)造函數(shù),想聲明該類的對象可以不必顯示地初始化它們,則必須顯示地寫一個無參的構(gòu)造函數(shù)。
四、
是不是每一個構(gòu)造函數(shù)初始化所有的數(shù)據(jù)成員?
構(gòu)造函數(shù)的用途就是用一種明確定義的狀態(tài)來設(shè)置對象。對象的狀態(tài)由對象的數(shù)據(jù)成員進行反映。每個構(gòu)造函數(shù)都要負責(zé)為所有的數(shù)據(jù)成員設(shè)置經(jīng)過明確定義的值。
有時這種說法也未必總是正確的。有時,類會有一些數(shù)據(jù)成員,它們只在它們的對象存在了一定時間之后才有意義。提這個問題,只是激勵你進行思考。
五、
類需要構(gòu)造函數(shù)么?
不是所有有構(gòu)造函數(shù)的類都需要構(gòu)造函數(shù)。如果深入考慮一個類要做些什么,那么該類是否需要析構(gòu)函數(shù)的問題就十分明顯了。應(yīng)該問一問該類是否分配了資源,而這些資源又不會有成員函數(shù)自動釋放,這就足夠了。特別是那些構(gòu)造函數(shù)里包含了new表達式的類,通常要在析構(gòu)函數(shù)中加上相應(yīng)的delete表達式,所以需要一個虛析構(gòu)函數(shù)。
六、
類需要一個虛析構(gòu)函數(shù)么?
有些類需要虛析構(gòu)函數(shù)只是為了聲明他們的析構(gòu)函數(shù)是虛的。當(dāng)然,決不會用做基類的類是不需要虛析構(gòu)函數(shù)的:任何虛函數(shù)只在繼承的情況下才有用。
虛析構(gòu)函數(shù)通常是空的。
七、
你的類需要復(fù)制構(gòu)造函數(shù)么?
很多時候答案都是“不”,但是有時候答案是“是”。關(guān)鍵在于復(fù)制該類對象是否就相當(dāng)于復(fù)制其數(shù)據(jù)成員和基類對象。如果并不相當(dāng),就需要復(fù)制構(gòu)造函數(shù)。
如果你的類在構(gòu)造函數(shù)內(nèi)分配資源,則可能需要一個顯示的復(fù)制構(gòu)造函數(shù)來管理資源。有析構(gòu)函數(shù)的類通常是析構(gòu)函數(shù)來釋放構(gòu)造函數(shù)分配的資源,這通常說明需要一個復(fù)制構(gòu)造函數(shù)。(空的虛析構(gòu)函數(shù)除外)
如果不想用戶能夠復(fù)制該類的對象,就聲明復(fù)制構(gòu)造函數(shù)為私有的。如果其他的成員不會使用這些成員函數(shù),聲明就足夠了,沒有必要定義它們。
八、
你的類需要一個賦值操作么?
如果需要復(fù)制構(gòu)造函數(shù),同理多半也會需要一個賦值操作。
九、
你的賦值操作符能正確地將對象賦給對象本身么?
賦值總是用新值取代目標(biāo)對象的舊值。如果原對象和目標(biāo)對象是同一個,而我們又奉行“先釋放舊值,再復(fù)制”的行事規(guī)程,那么就可能在還沒有實施復(fù)制之前就把原對象銷毀了。
十、
你的類需要定義關(guān)系操作符么?
如果你的類邏輯上支持相等操作,那么提供operate== 和operate!=可能會有好處。類似的,如果你的類的值有某種排序關(guān)系,那就可能會想提供余下的關(guān)系操作符。只要它們想創(chuàng)建你的類型的有序集合,你就必須提供關(guān)系操作符。
十一 刪除數(shù)組時你記住了用delete[]么?
這個形式的存在,是C++希望在保持與C的兼容性的同時關(guān)注效率。C++要求用戶告知要被刪除的是不是數(shù)組。如果是,該實現(xiàn)就可能會提供另一個地方來存儲長度,因為與數(shù)組所需的內(nèi)存量相比,這個常數(shù)的開銷會小很多。
十二
記得在復(fù)制構(gòu)造函數(shù)和賦值操作符的參數(shù)類型中加上了const么?
復(fù)制構(gòu)造函數(shù)應(yīng)該是像X::X(const X&)這樣,畢竟復(fù)制對象不會改變原對象。實際上,由于綁定一個非const引用到一個臨時對象是非法的,使用X::X(X&)作為復(fù)制構(gòu)造函數(shù)不會允許復(fù)制任何特殊表達式的結(jié)果。同樣道理適用于賦值。
十三 如果函數(shù)有引用參數(shù),它們應(yīng)該是const引用么?
只有當(dāng)函數(shù)想改變參數(shù)時,它才應(yīng)該有不用const聲明的引用參數(shù)。
其中很多作者提到,提這些問題并不是希望去尋求答案,只是希望能夠激勵你進行思考。所以當(dāng)我們設(shè)計一個類的時候,多思考一下,有沒有什么地方需要注意的,我們設(shè)計的類將會更合理,更健壯一些。
posted on 2009-07-25 08:32
Sandy 閱讀(302)
評論(0) 編輯 收藏 引用 所屬分類:
c++學(xué)習(xí)