系統從新學習C++語言部分,記錄重要但易被忽略的,關鍵但易被遺忘的。算法
一、拋出異常類時,雖然catch的是一個引用,可是也會產生一次拷貝,由於當拋出異常的函數在棧解退的過程當中會會調用異常類的析構函數,異常類將不復存在。編程
二、若是有一個異常類層次結構,應該這樣排列catch塊:將捕獲位於層次結構最下面的異常類的catch語句放在最前面,將捕獲基類異常的catch語句放在最後面。拋出異常的順序要與catch塊相反。數組
三、在catch語句中使用基類對象時,將捕獲全部的派生類對象,但派生類特性將被剝去,所以將使用虛方法的基類版本。app
四、 將dynamic_cast用於引用時,因爲沒有與空指針對應的引用值,所以沒法使用特殊的引用值來表示失敗,當請求不正確時,將引起bad_cast的異常。dom
五、reinterpret_cast運算符並不支持全部的類型轉換,例如,能夠將指針類型轉換爲足以存儲指針的整數,但不能將指針轉換爲更小的整型或浮點型。另外一個限制是,不能將函數指針和數據指針互相轉換。ide
六、使用new分配內存時,可使用auto_ptr、unique_ptr、shared_ptr、但只有unique_ptr有使用new[]和delete[]的版本。函數
七、在unique_ptr爲右值時,能夠將其賦值給shared_ptr,模板shared_ptr包含一個顯式構造函數,能夠用於將右值unique_ptr轉換爲shared_ptr。學習
八、對於全部內置的算術運算符、關係運算符和邏輯運算符,STL都提供了等價的函數符(仿函數)。spa
九、valarray模板類重載了許多運算符,能夠直接參與大多數數值運算;slice類可用做數組索引,它接受三個值初始值:起始索引、索引數、跨距。指針
1 valarry<double> arr(10); 2 arr[slice(1,4,3)] = 10;
slice(1,4,3)建立的對象表示選擇4個索引,這能夠將arr的第一、四、七、10個元素都設置爲10。
十、迭代器類型
Input iterator(輸入迭代器) | 讀,不能寫;只支持自增運算 |
Output iterator(輸出迭代器) | 寫,不能讀;只支持自增運算 |
Forward iterator(前向迭代器) | 讀和寫;只支持自增運算 |
Bidirectional iterator(雙向迭代器) | 讀和寫;支持自增和自減運算 |
Random access iterator(隨機訪問迭代器) | 讀和寫;支持完整的迭代器算術運算 |
十一、對於標準錯誤輸出,是沒有緩衝區的。
十二、在使用cout時,可使用成員函數width()設置下一次輸出時的字段寬度,默認右對齊並以空格填充空白字段,當字段寬度不足時,C++不對截斷輸出寬度;使用成員函數fill()用來填充空白字段;使用成員函數precision()來設置浮點數輸出精度;成員函數setf()與unsetf()提供了更豐富的輸出格式設置方法,但使用標準控制符將更加簡單。
1三、對於cin的get()方法和getline()方法來講,若是沒有讀取到任何字符(getline()將換行符視爲一個字符),則設置failbit;若是讀取了最大數目的字符,但行中還有其餘字符,getline()將設置failbit。
1四、cin的peak()方法能夠查看輸入流中的下一個字符,gcount()方法能夠返回最後一個非格式化抽取方法讀取的字符數,putback()方法能夠將字符插入到輸入字符串中。
1五、fstream類中的方法seekg()和seekp()分別將輸入指針和輸出指針移到指定的文件位置,事實上,因爲fstream類使用緩衝區來存儲中間數據,所以指針指向的是緩衝區中的位置,而不是實際的文件。
1六、fstream類中的方法tellg()和tellp()方法分別返回輸入流、輸出流當前指針的位置,對於fstream對象,輸入輸出指針將一前一後地移動,所以它們的返回值相同。但對於使用istream對象來管理輸入流,而使用ostream對象來管理同一個文件的輸出流,則輸入指針和輸出指針將彼此獨立的移動。
1七、關於如何生成臨時文件,使用tmpnam()能夠生產TMP_NAM個不一樣的文件名,其中每一個文件名包含的字符不超過L_tmpnam個。
1八、C++庫還提供了sstream族(包含ostringstream類和istringstream類),它們使用相同的接口提供程序和string對象之間的IO。
1九、新標準引入的移動語義,用來修飾六個特殊函數的default關鍵字,用來刪除任意成員函數的delete關鍵字,以及使用相似初始化列表的方式在一個構造函數中使用另外一個構造函數(被稱爲委託構造),以及使用using 類名::函數名,使基類全部的非特殊成員函數對派生類能夠用(繼承構造函數),以及顯示聲明重寫(覆蓋)某個虛函數的標識符override,以及禁止派生類覆蓋特定的虛函數標識符final。
20、C++11引入lambda表達的主要目的是可以將相似於函數的表達式用做接受函數指針或函數符的函數的參數。
2一、C++提供了多個包裝器對象,用於給其餘編程接口提供更一致或更合適的接口。C++11提供了包括模板bind(替代bind1st和bind2nd)、men_fn(將成員函數做爲常規函數傳遞)和reference_wrapper(建立行爲像引用但可被複制的對象)以及funtion(以統一的方式處理多種相似於函數的形式,使用模板時可減小可執行代碼的規模)。
2二、正確使用遞歸實現可變參數模板。
2三、C++11增長了對並行編程的支持,以及至關多的新增庫等。
2四、C++容許定義指向類成員(包括數據和函數)的指針,這種語法須要使用到成員解除引用運算符(* 、->*)。
2五、C++11新增了alignof運算符,它接受一個類型做爲參數,返回這個類型的對齊方式;noexcept關鍵字用於指出函數不會引起異常,它也能夠用做運算符,判斷表達式是否可能引起異常,不引起返回true。
2六、STL提供了豐富的全局函數,包括查詢,排序,複製等一系列算法。
2020年6月2日,星期二,凌晨2點01分,首次完整讀完這本書,共勉。
學如逆水行舟,不進則退;心似平原放馬,易縱難收。