條款01:把C++看做一個語言聯邦c++
C++是一種多重範型編程語言,一個同時支持過程(procedural),面向對象(object-oriented),函數形式(functional),泛型形式(generic),元編程(metaprogramming)的語言算法
一、c part of C++,c++時以c爲基礎發展起來的,徹底兼容於c語言編程
二、object-oriented C++,面向對象的封裝、繼承、多態等三大特性,C++都可以很好支持數組
三、template C++,使得C++支持泛型編程編程語言
四、STL,STL是個標準模板庫,它對容器,迭代器,算法,函數對象等進行了封裝,使得使用者可以直接調用ide
注意:函數
因爲C++存在以上四種多重範型編程,故使用時注意不一樣語言層次,進行高效編程的原則也會存在差別工具
條款02:儘可能以const、enum、inline替換#definethis
該條款從宏觀工具來講也能夠爲:儘可能用編譯器代替預處理器spa
一、對於引用接口頭文件中的宏,在編譯時如果異常,使用者很難追蹤到問題源頭;因宏直接被替換,到編譯時候,其名稱只存在於預編譯階段,而不會進入編譯階段的的符號表中;
二、const常量可以比#define產生更輕量的代碼,因#define定義的變量在替換時候會產生多個副本,而const則不會
三、const支持變量限定做用域,而#define則老是全局有效
四、對於class專屬常量,對於有的編譯器,其定義域聲明同普通成員變量的聲明一致,且能夠同事給予賦值;對於有的編譯器則不行,必須按照函數定義的形式給以賦值;若是變量的值必須在聲明時要求給定(如該變量將做爲類成員變量數組成員的大小)
class GamePlayer
{
private:
static const int NumTurns = 5;
int Scores[NumTurns];
}
若編譯器不容許聲明時給NumTurns賦值,則可藉助枚舉進行規避,
class GamePlayer
{
private:
enum { NumTurns = 5 };
int Scores[NumTurns];
};
此處的枚舉變量與常量的區別在於:常量能夠取地址,而枚舉變量不可以取地址
總結:
一、對於單純變量,最好以const對象或enums替換#defines
二、對於形似函數的宏(宏函數),最好改用inline函數替換#defines
條款03:儘量使用const
一、若是const出如今*左側,則表示指針所指物爲常量,若const出如今*右側,則表示指針本省爲常量
二、在一個函數聲明式中,const能夠和函數返回值、個個參數、函數自身(若爲成員函數)產生關聯,
若將返回值申明爲const則能夠避免a*b = c 相似的錯誤
若將不改變的變量聲明爲const 能夠避免if(a = 0)相似的錯誤
三、const成員函數的優勢:
a、它使得成員函數更容易被理解,很容易得知哪一個函數能夠改動對象內容而哪一個函數不能夠
b、它們是操做「const 對象」成爲可能,是pass by reference to const方式傳遞對象得技術前提
c、兩個成員函數若是隻是常量性不一樣,能夠被重載
class TextBlock { public: const char& operator[](std::size_t position) const { return text[position];} char& operator[](std::size_t position) { return text[position]; } private: std::string text; } TextBlock tb("Hello"); std::cout << tb[0]; //調用非const operator[] const TextBlock ctb("Hello") std::cout << ctb[0] //調用const operator[] void print(const TextBlock& ctb) { std::cout << ctb[0]; }
四、bitwise constness 和 logical constness
a、bitwise經過檢查函數內有無賦值操做來斷定;爲了保證bitwise的常量性,不容許在const函數中存在爲non-static成員變量賦值得操做,爲了破除這種限制,須要在non-static變量申請時,添加mutable關鍵字 mutable std::size_t textLength;
b、在const與非const函數的聲明中形成了代碼的高度重複
c、const_cast<type>(xxx)可以去除xxx變量的const屬性;static_cast<const type>(xxx)可以爲xxx變量加上const屬性
d、必須使用非const函數中調用const函數的方式,因使用const中調用非const將破壞const函數的 bitwise constness
class TextBlock { public: const char& operator[](std::size_t position) const { ... ... ... return text[position]; } char& operator[](std::size_t position) { return const_cast<char&>( //將op[]返回值的const去除 static_cast<const TextBlock&>(*this) //爲*this加上const [position] //調用op[] ); } private: std::string text; }
注意:
一、若是函數得返回類型是個內置類型,那麼改動函數得返回值歷來就是不合法得
二、將某些東西聲明爲const,有利於編譯器偵測出錯誤
三、編譯器強制實施bitwise constness