標籤: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++類