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