條款1:視C++為一個語言聯邦
記住:
★C++高效編程守則視狀況而變化,這取決於你使用C++的哪一部分
C;
Object-oriented c++;
Template c++;
STL
條款2:盡量以const,enum,inline替換#define
記住:
★對於單純常量,最好以const對象或enums替換#define
★對於形似函數的宏,最好改用inline函數替換#define
------------------------------------------------------------------------------------------------------
延伸:面試時經常會被問到的一個典型問題是:參數宏與函數的區別,我想可以從如下幾個角度來回答:
a 函數調用要先求出實參表達式的值,然後代入形參;宏只是字符替換;
b 宏替換只占編譯時間;函數調用占運行時間;
c 函數運行時可調試,宏不可;
d 函數會做參數類型檢查,宏不會;
e 使用宏次數多時宏展開後源程序變長;函數調用不會;
條款3:盡可能使用const
記住:
★將某些東西聲明為const可幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內的對象、函數參數、函數返回類型、成員函數本體
★編譯器強制實施bitwise constness,但你寫程序時應使用“概念上的常量性”(conceptual constness)
★當const和non-const成員函數有著實質等價的實現時,令non-const版本調用const版本可避免代碼重復
----------------------------------------------------------------------------------------------------------------------
1 一條規則:
const出現在*左,表示被指物是常量: const int *p = NULL;
*右, 指針自身是常量:int *const p = NULL;
*兩邊, 兩者都是常量:const int *const p = NULL;
對於被指物是常量的情形,const 寫在類型前後無關:const int *p 等價於 int const *p
2 STL迭代器中const的用法:
迭代器自身是const的用法: const std::vector<int>::iterator iter = vec.begin();
*iter = 10; //可以,改變iter所指之物
++iter; //錯誤,iter自身是const
迭代器所指之物是const的用法:std::vector<int>::const_iterator cIter = vec.begin();
*cIter = 10; //錯,*cIter是const
++cIter; //沒問題,cIter本身可以變化
3 const成員函數
將const實施於成員函數的目的是為了確認該成員函數可作用於const對象身上。這類成員函數重要的兩個原因:
一、使class接口較容易被理解。因為可得知哪個函數可改動對象內容而哪個不行很是重要;
二、使“操作const”對象成為可能。
4 bitwise constness(或physical constness)和logical constness
利用mutable可釋放掉non-static成員變量的bitwise constness約束
5 在const和non-const成員函數中避免重復
利用const成員函數實現出其non-const成員函數:舉例:
1 class TextBlock { 2 ... 3 const char& operator[]( std::size_t position ) const { //const版本 4 ... 5 ... 6 ... 7 return text[position]; 8 } 9 10 char& operator[]( std::size_t position ) { //用const實現的non-const版本 11 12 return 13 const_cast<char&>( 14 15 static_cast<const TextBlock&>(*this)[position] //轉換後調用const版[] 16 ); 17 } 18 19 ... 20 }
理解:這份代碼有兩個轉型動作
一、將*this從其原始類型TextBlock&轉型為const TextBlock&(這使得接下來調用operator[]時得以調用const版本成員函數)
二、從const operator[]的返回值中移除const
最後需要注意:non-const成員調用const成員可以,但反之不行!!!