Google C++ style guide——C++類

來源:互聯網
上載者:User

標籤:bsp   添加   div   uid   guide   父類   未定義   靜態成員函數   代碼   

1.建構函式的職責
建構函式中僅僅進行那些沒有實際意義的初始化。由於成員變數的“有意義”的值大多不在建構函式中確定。
能夠的話,使用Init()方法集中初始化為有意義的資料。


長處:排版方便,無需操心類是否初始化。
缺點:
1)在建構函式中不易報告錯誤,不能使用異常;
2)操作失敗會造成對象初始化失敗,引起不確定狀態。
3)建構函式內調用虛函數。調用不會派發到子類實現中,即使當前沒有子類化實現,將來仍是隱患;
4)如果有人建立該類型的全域變數,建構函式將在main()之前被調用,有可能破壞建構函式中暗含的如果條件。


假設,對象須要有意義的初始化。考慮使用另外的Init()方法並(或)添加一個成員標記來指示對象是否已經初始化。


2.預設建構函式
當一個類有成員變數又沒有建構函式的時候。須要定義一個預設的建構函式,否則編譯器將會自己主動產生預設建構函式。


預設建構函式更適合於初始化對象,使對象內部狀態一致、有效。


編譯器產生的建構函式並不會對對象進行初始化。
假設你定義的類繼承現有類,而你又沒有添加信的成員變數。則不須要為新類定義預設建構函式。


3.明白的建構函式
對單參數建構函式使用C++keywordexplicit。
通常,僅僅有一個參數的建構函式可被用於轉換。
比如:定義了Foo::Foo(string name)跟void FooTest(Foo foo)
這個時候FooTest須要的是一個Foo對象作為參數。假設你傳入的是string類型的參數的話。建構函式Foo::Foo(string name)將被調用。
而且將該字串轉換為一個Foo暫時對象傳給FooTest。
為避免建構函式被調用造成隱士轉換。能夠將其聲明為explicit。


全部單參數建構函式必須是明白的。

在類定義中,將keywordexplicit夾到單參數建構函式前。
例外:在少數情況下,拷貝建構函式能夠不聲明為explicit;特意作為其它類的透明封裝器的類。類似情況應在凝視中明白說明。


4.拷貝建構函式
僅在代碼中須要拷貝一個類對象的時候使用拷貝建構函式;不須要拷貝時應使用DISALLOW_COPY_AND_ASSIGN。


大量的類並不須要可拷貝。也不須要一個拷貝建構函式或賦值操作。
但假設你不主動聲明它們。編譯器會為你自己主動產生。並且是public的。
能夠考慮在類的private中加入空的拷貝建構函式和賦值操作,僅僅有聲明,未定義。
為了方便,能夠使用宏DISALLOW_COPY_AND_ASSIGN。


//禁止使用拷貝建構函式和賦值操作的宏
//應在類的private:中使用
#define DISALLOW_COPY_AND_ASSIGN(TypeName)               \
        TypeName(const TypeName&);//拷貝建構函式         \         
        void operator=(const TypeName&)//賦值操作函數


class Foo {
 public:
  Foo(int f);
  ~Foo();
 private:
  DISALLOW_COPY_AND_ASSIGN(Foo);
};


絕大多數情況下都應該使用DISALLOW_COPY_AND_ASSIGN,假設類確實須要可拷貝,應該在類的標頭檔裡說明原有,並適當定義拷貝建構函式和賦值操作。


5.結構體和類
僅當僅僅有資料時使用struct,其它一概使用class。
假設與STL結合,對於仿函數和特效能夠不用class而是使用struct。
注意:類和結構體的成員變數使用不同的命名規則。
類的成員變數下面劃線(_)結尾,結構體與普通變數一樣。都是小寫。




6.繼承
使用組合通常比使用繼承更適宜,假設使用繼承的話,僅僅使用公用繼承。


C++實踐中,繼承主要用於兩種場合:實現繼承。子類繼承父類的實現代碼;介面繼承。子類僅繼承父類的方法名稱。


假設該類具有虛函數。其解構函式應該為虛函數。


限定僅在子類訪問的成員函數為protected,須要注意的是資料成員應始終為私人。


7.多重繼承
真正須要用到多重實現繼承的時候很少。僅僅有當最多一個基類中含有實現,其它基類都是以Interface為尾碼的純借口類時才會使用多重繼承。


僅僅有當全部超類除第一個外都是純介面時才幹使用多重繼承。為確保它們是純介面。這些類必須以Interface為尾碼。


8.介面
當一個類滿足下面要求時,稱之為純介面:
1)僅僅有純虛函數和靜態函數(解構函式除外);
2)沒有非待用資料成員;
3)未定義不論什麼建構函式,假設有,也不含參數,而且為protected。
4)假設是子類,也僅僅能繼承滿足上述條件以Interface為尾碼的類。


9.操作符重載
除少數特定環境外,不要重載操作符。
一般不要重載操作符,尤其是賦值操作(opeartor =)比較陰險,應避免重載。


假設須要的話,能夠定義類似Equals(),CopyFrom()等函數。




10.存取控制
將資料成員私人化。並提供相關存取函數。
如定義變數foo_以及存取子foo()、賦值函數set_foo()。


11.聲明次序
在類中使用特定的聲明次序:public在private之前,成員函數在資料成員前。


定義次序例如以下:public、protected、private。
每一塊中,聲明次序一般例如以下:
1)typedefs和enums;
2)常量;
3)建構函式。
4)解構函式。
5)成員函數。含靜態成員函數;
6)資料成員,含待用資料成員。
宏DISALLOW_COPY_AND_ASSIGN至於private塊之後。作為類的最後部分。


12.編寫短小函數
傾向於選擇短小、凝練的函數。
長函數有時是恰當的,因此對於函數長度並沒有嚴格限制。
假設函數超過40行。能夠考慮在不影響程式結構的情況下將其切割一下。

Google C++ style guide——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.