前言
《C++ Primer》第三版這本書還是去年做Window Mobile 6開發時看完的,看完後做了一些筆記到本子後就沒管了。今天偶爾翻出來趕緊寫一篇文章備份一下,據說每次重讀這本書都有新的收穫,正所謂溫故而知新,可見這本書之經典。
聲明
歡迎轉載,但請保留文章原始出處:)
部落格園:http://www.cnblogs.com
農民伯伯: http://over140.cnblogs.com
本文
1. 如果一個變數是在全域定義的,系統會保證給它提供初始化值0。如果變數是局部定義的,或是通過new運算式動態分配的,則系統不會向它提供初始值0
2. 一般定義指標最好寫成:" string *p; " 而不是 " string* p; "
3. 試圖將一個非const對象的指標指向一個常量對象的動作將引起編譯錯誤
4. 參考型別主要作用於函數的形式參數 P/89
5. 枚舉成員的值不必唯一
6. 一個數組不能被另外一個數組初始化,也不能被賦值給另一個數組。而且,C++不允許聲明一個引用數組(即由引用組成的數組) P/95
7. volatile修飾符的主要目的是提示編譯器,該對象的值可能在編譯器未檢測到的情況下被改變,因此編譯器不能對引用這些對象的代碼作最佳化處理。
8. 逗號運算式的結果是最右邊運算式的值(從左向右) P/135
9. 關於位操作符的詳細介紹和使用方法參見P/136,講得很透徹
10. 容器
10.1 關聯容器
10.1.1 map P/247
"鍵/值"對:鍵用來索引map,而值用來儲存資料。
插入單個元素最好用insert(不使用下標方式) P/248 - P/249
10.1.2 set P/256
10.1.3 比較 P/247
如果只想知道一個值是否存在時,用set最有用,希望儲存(也可能修改)一個相關的值時,map最有用
10.2 順序容器
10.2.1 list
非連續記憶體地區,允許雙向遍曆,插入、刪除效率高,對隨機訪問支援不好,需要遍曆,且每個元素有兩個指標的額外空間開銷。
10.2.2 vector
表示一段連續的記憶體地區,每個元素被順序儲存在這段內中。隨機訪問效率很高,但是插入、刪除效率低(除非是最後一個元素),右邊的元素都要重新拷貝一次。(deque也是一端連續記憶體,但是支援高效的在首部插入和刪除元素。它通過兩級數組結構來實現。)
vector自增長方式:分配兩倍於當前容器的儲存區,把當前的值拷貝到新分配的記憶體中,並釋放原來的記憶體。
10.2.3 list與vector比較 (vector還是list? P/213)
11. 調用函數比直接計算條件操作符要慢得多——inline機制用來最佳化小的、只有幾行的、經常被調用的函數 P/303
12. 標頭檔不應該含有非inline函數或對象的定義
13. 在函數中頻繁使用的自動變數可使用register聲明為寄存器自動對象。出現在迴圈語句中的數組索引和指標是寄存器對象的很好例子:
for( register int ix = 0; ix < sz; ++ix )
如果所選擇的變數被頻繁使用,則寄存器變數可以提高函數的執行速度。
注意:關鍵字register對編譯器來說只是一個建議,有些編譯器可能忽略該建議,而是使用寄存器分配演算法找出最合適的候選放到機器可用的寄存器中。 P/337
14. 如果運算元被設定為0,則C++會保證delete運算式不會叫用作業符delete(),沒有必要測試是否為0。 P/340
if( pi != 0 ) //沒必要寫這行
delete pi;
15. delete pi 之後,pi成為空白懸指標,建議設定指標為0 P/340
16. 自動指標auto_ptr 見P/341
17. C++支援從C語言繼承而來支援顯式初始化表的機制,類似於用在初始化數組:
Data local1 = { 0, 0 };
//相當於local1.ival = 0; local1.ptr = 0;
根據資料成員被聲明的順序,這些值按位置被解析。 P/566
18. explict關鍵字用於關閉編譯器隱式轉換
19. 每個return語句之間,內聯解構函式都必須被展開(編譯時間),所以建議函數內盡量少return,可用其它變數代替的就代替。
20. int a = b + c ; //是對a的初始化
int a;
a = b + c ; //賦值操作,前面比後面高效
21. "::"、".*"、"."、"?:"四個操作符不能被重載
22. typeid用於擷取對象/變數的實際類型,用法:typeid(type).name()
23. 函數介紹
sizeof 作用是返回一個對象或類型名的位元組長度。 P/132
isalpha 判斷是不是一個英文字母
#include <cstring>
int strlen( const char* ) //返回字串的長度
int strcmp( const char*, const char* ) //比較兩個字串是否相等
char* strcpy( char*, const char* ) //把第二個字串拷貝到第一個字串中
#include <assert.h>
assert 通用預先處理宏(斷言 P/12)
#include <algorithm> //包括各種資料結構的元素檢索、替換、逆序等等通用的演算法。sort/find/max
#include <iomanip>
setw() //功能與scanf類似,它讀入的字元數最多為傳遞給它的參數減1 P/112