標籤:indicator 支援 .com com cat 自身 length lock const成員函數
條款01:把C++看作一個語言聯邦
C++是一種多重範型程式設計語言,一個同時支援過程(procedural),物件導向(object-oriented),函數形式(functional),泛型形式(generic),元編程(metaprogramming)的語言
1、c part of C++,c++時以c為基礎發展起來的,完全相容於c語言
2、object-oriented C++,物件導向的封裝、繼承、多態等三大特性,C++都能夠很好支援
3、template C++,使得C++支援泛型程式設計
4、STL,STL是個標準模板庫,它對容器,迭代器,演算法,函數對象等進行了封裝,使得使用者能夠直接調用
注意:
由於C++存在以上四種多重範型編程,故使用時注意不同語言層次,進行高效編程的原則也會存在差異
條款02:盡量以const、enum、inline替換#define
該條款從宏觀工具來說也可以為:盡量用編譯器代替前置處理器
1、對於引用介面標頭檔中的宏,在編譯時間若是異常,使用者很難追蹤到問題源頭;因宏直接被替換,到編譯時間候,其名稱只存在於先行編譯階段,而不會進入編譯階段的的符號表中;
2、const常量能夠比#define產生更輕量的代碼,因#define定義的變數在替換時候會產生多個副本,而const則不會
3、const支援變數限定範圍,而#define則總是全域有效
4、對於class專屬常量,對於有的編譯器,其定義域聲明同普通成員變數的聲明一致,且可以同事給予賦值;對於有的編譯器則不行,必須按照函數定義的形式給以賦值;如果變數的值必須在聲明時要求給定(如該變數將作為類成員變數數群組成員的大小)
class GamePlayer
{
private:
static const int NumTurns = 5;
int Scores[NumTurns];
}
若編譯器不允許聲明時給NumTurns賦值,則可藉助枚舉進行規避,
class GamePlayer
{
private:
enum { NumTurns = 5 };
int Scores[NumTurns];
};
此處的枚舉變數與常量的區別在於:常量可以取地址,而枚舉變數不能夠取地址
總結:
1、對於單純變數,最好以const對象或enums替換#defines
2、對於形似函數的宏(宏函數),最好改用inline函數替換#defines
條款03:儘可能使用const
1、如果const出現在*左側,則表示指標所指物為常量,若const出現在*右側,則表示指標本省為常量
2、在一個函式宣告式中,const可以和函數傳回值、個個參數、函數自身(若為成員函數)產生關聯,
若將傳回值申明為const則可以避免a*b = c 類似的錯誤
若將不改變的變數聲明為const 可以避免if(a = 0)類似的錯誤
3、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];}
4、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; } View Code
注意:
1、如果函數得傳回型別是個內建類型,那麼改動函數得傳回值從來就是不合法得
2、將某些東西聲明為const,有利於編譯器偵測出錯誤
3、編譯器強制實施bitwise constness
effective c++ (一)