編寫C++類的條款

來源:互聯網
上載者:User

標籤:

如何專業的定義一個class?這裡記錄一下自己的checklist

- 關於建構函式的注意點

a. 建構函式聲明為explicit,避免隱式轉換

b. 考慮禁用複製建構函式、賦值函數

c++中,預設對於類會產生以下成員函數(如果你沒有定義的話,這通常是不可控的)

class Empty() {        public:                Empty();                ~Emtpy();                                                   Empty* operator&();                  //取址運算子                const Empty* operator&() const;      //取址運算子 const        private:                  Empty(const Empty &);                //賦值建構函式                Empty& operator=(const Empty &);     //賦值運算子}

這裡取址函數不用多說,關鍵是賦值相關的兩個函數,預設是淺copy的,所以還是禁用,參考解構函式注意點

c. 建構函式儘管可以拋出異常,但沒有傳回值;所以可以考慮單獨實現一個Init函數作為補充

- 採用初始化列表而不是賦值初始化成員變數,有兩種情況你必須這樣做:

a. const \ reference的成員

b.衍生類別的方法中需要調用基類的建構函式

Base(int x):m_x(x) {}Derived(int x) : Base(x) {}

- 成員函數如果不改變類的狀態,聲明時後加const

- 儘可能將成員變數private更可控,更透明

- 以非member 方法代替需要多個對象的member組合功能的實現

- 考慮Law of Demeter,適當做一個權衡,少一些wrapper或中介類

- 關於解構函式的注意點
a. 一個類要被繼承時(其往往含有虛函數要多態),要提供虛解構函式,否則存在下面的情況:

    Base *pb = new Derived();    delete pb;//這裡就不會調用衍生類別的解構函式,儘管pb的虛指標指向了派生的虛表,但其虛表中沒有虛解構函式,造成派生對象資源流失

b.只要有基類的解構函式是虛擬,那麼所有的衍生類別不管是否明確的寫了虛擬解構函式,派生了的解構函式可以認為一定是虛擬。如同類的虛指標,所有派生的預設都有

c.在析構中不要拋出exception,否則實現此異常介面
如果類含有指標成員和引用成員,則該類型通常需要實現解構函式(這裡不一定是虛的,但是需要考慮清理記憶體)
更進一步,一旦實現了解構函式,就進而需要實現實現拷貝建構函式與拷貝複製函數,否則,需要明確拒絕(或者,僅僅一個理由:做副本有沒有道理,見這裡第一個條款)

 

編寫C++類的條款

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.