寫在前面:以前一直有在寫博客,可是老是沒堅持下來,感受博客做爲記錄本身學習過程的工具仍是十分有意義的,故而決定在這兒開始我博客之路的第一步,以C++的學習爲始,從獲得大量好評的Effective C++ 開始入手,記錄本身學習的路程和對一些問題的思考。c++
effective C++給出了55個改善C++程序的具體建議,而且提出了一些在C++程序設計中常常出現的坑。程序員
建議 01 : 視C++爲一個語言集算法
View C++ as a federation of languages
早期的C++只是簡單的在C上作了面向對象的拓展,發展到今天,C++已是一個多重泛型編程語言(multiparadigm programming),它支持:編程
它由4個子集組成,在書中將其稱爲"次語言"(sublanguage), 我以爲這個描述不太好,特別是對於其中的泛型編程和STL來講,稱爲語言老是有些牽強, 我更願意將它理解爲子集的概念, 這4個子集分別爲:設計模式
因此不能簡單的講C++認爲是一個語言,而是時刻注意它4個部分不一樣的規則,而且利用它們來完成更好的設計。數組
建議 02 :儘可能用const, enum, inline來替換 #define編程語言
Prefer consts, enums, and inlines to #defines
這條建議是全部像我同樣習慣C開發轉向C++開發的程序員,在C程序中,爲了讓程序更簡單修改,減小簡易函數的棧開銷,經常會使用#define來聲明宏變量或者宏函數,可是在C++中,這是不被提倡的,由於#define定義的宏在預編譯階段展開,不會將它描述的變量生成在符號表(symbol table)中,同時,若是使用宏來描述一個浮點型常量,預編譯處理器可能會盲目替換代碼中對應的浮點數宏變量,雖然這樣就不須要爲其分配內存,可是事實上代碼存儲也是須要內存的,反而得不償失。函數
另外, 須要注意的是在類中對const參數的初始化,通常來講,常量值使用聲明式在頭文件中完成聲明。工具
能夠在聲明時初始化:學習
class GamePlayer { private: static const int NumTurms = 5; //爲了使得常量只有一份實體 ... }
或者在類中聲明,類外初始化
struct GamePlayer { private: static const int Numturms; //聲明式 頭文件(.h)聲明 ... } const int GamePlayer::Numturms = 5; //實現文件初始化(cpp/cc)
一個比較有趣的操做是emum補償,編譯器必需要在編譯期間得到數組的大小,有的編譯器不容許「static int class」 常量」 完成 "int class 初始化操做" ,就是不能使用class內的static int 常量來做爲數組大小,此時就能夠曲線救國,使用所謂的「the enum hack」補償作法,其理論基礎是,一個屬於枚舉類型(enumerated type)的數值可被當作int使用,因此能夠這樣聲明數組:
class GamePlayer { private: enum { Numturms = 5 }; //"the enum hack" 講NUmturms 做爲5的記號 int scores[Numturms]; //聲明數組 }
enum hack有多種用途,認識它是十分有必要的。enum hack的行爲比較相似與#define 而不是const,即它在內存中沒有實體,只是做替換功能,因此不能對它取地址,這樣也從某種角度實現了一種約束,指針沒法指向它,根據編譯器的不一樣,有的編譯器會對const對象設定另外的存儲空間(沒有指針和引用指向的狀況下),有的編譯器則會,可是使用enum hack卻能夠保證不會有這部分的額外開銷。
enum hack仍是template metaprogramning(模板元編程)的基礎技術。
在什麼狀況下替換
對於單純的常量,最好使用const 對象或者enum來替換#define 對於相似與函數的宏(macros),最好使用inline函數替換#define,雖然這樣編譯器會選擇是否內聯,可是這也是咱們想要的。