系統從新學習C++語言部分,記錄重要但易被忽略的,關鍵但易被遺忘的。html
一、C++相對於C增長了最關鍵的兩項,面向對象和範型編程。express
二、對於變量明,C++沒有長度限制;同時,以兩個下劃線或一個下劃線和大寫字母開頭的名稱被保留給實現(編譯器及其使用的資源)使用;以一個下劃線開頭的名稱被保留給實現,用做全局標識符。編程
三、C++11提供一種大括號初始化器,能夠用它初始化任何類型。函數
1 int ham = {24}; 2 int ems{7}; 3 int roc = {}; // 爲0 4 int rhs{};
四、對於整型字面值,若是第一位爲1~9則爲十進制;若是第一位爲0,第二位爲1~7,則是八進制;若是前兩位爲0x或0X,則爲十六進制。若是但願使用cout輸出八進制或十六進制格式的整數,可使用cout的控制符(這三個控制符都被包含在std命名空間)。學習
1 cout << dec << a; // 10進制,默認的 2 cout << oct << b; // 8進制 3 cout << hex << c; // 16進制
五、cout.put()、cin.get()的用法,可參照C語言中get()與put()的用法。編碼
六、C++有一種表示特殊字符的機制,他獨立於鍵盤,被稱做通用字符名。通用字符名以\u或\U開頭,前者後面是8個十六進制位,後者後面則是16個十六進制位。這些位表示的是ISO10646碼點。spa
七、對於寬字符類型wcha_t,cin和cout沒法很好的處理,此時應該使用wcin和wcout。指針
八、C++11新增了char16_t和char32_t類型,C++11使用前綴u表示前者,U表示後者;並與形式爲\u00F6和\U0000222B的通用字符名匹配。code
1 u'C' u「be good」 U'R' U」dirty rat」
九、cin使用空白(空格、製表符、換行符)來肯定字符串結束的位置,而cin.getline()能夠依據換行符來讀取整行,而且能夠制定最多讀取字符的數量。htm
十、可使用沒有名稱的結構類型,方法是省略名稱,同時定義一個結構類型和一個這種類型的變量,不經常使用,可用做臨時變量。
十一、C++容許對一個整數強制類型轉換爲一個枚舉值,並參與賦值操做;同時能夠有多個值相同的枚舉值,目前枚舉值也可使用long,long long類型的值。對於較小的值編譯器會使用一個字節甚至更少的的字節,對於包含long類型的枚舉,會使用4個字節。
十二、在C中容許給指針直接賦字面值,但C++不容許,必須進行類型轉換。
1三、前綴遞增,前綴遞減,解除引用運算符的優先級相同,以從右往左的方式進行結合;後綴遞增,後綴遞減的優先級相同,但比前綴運算符的優先級高,以從左往右的方式結合。
1四、 cin.get(ch)和cin.get()的區別。
屬性 | cin.get(ch) | cin.get() |
傳遞輸入字符的方式 | 賦值給參數ch | 將函數返回值賦給ch |
用於字符輸入時函數的返回值 | istream對象(執行bool轉換後爲true) | int類型的字符編碼 |
到達EOF時函數的返回值 | istream對象(執行bool轉換後爲false) | EOF |
1五、若是數據類型自己並非指針,則能夠將const數據或者非const數據的地址賦給指向const的指針,但只能將非const數據的地址賦給非const指針。
1六、函數重載後,在調用函數時,若是沒有徹底相同的參數類型,編譯器會作強制類型轉換進行匹配,但若是有多個可轉換的類型(也就是說有多個重載過的函數),C++將拒絕這種函數調用。
1七、函數重載的關鍵是函數的參數列表,也成爲特徵標,如下兩個聲明互斥:
1 long gronk(int n, float m); 2 double gronk(int n, float m);
C++不容許這種方式的重載,返回類型能夠不一樣,但特徵標必須也不一樣。
1八、對於重載了引用參數的函數,C++將選擇調用最匹配的版本,這使得可以根據參數是左值引用,const類型的左值引用仍是右值引用來定製函數的行爲。
1九、 函數模板並不是函數定義,在使用模板時,編譯器會針對特定的類型生成函數實例,這種實例化方式被稱爲隱式實例化。
20、C++容許顯式實例化,也就是說能夠針對特定類型使用模板生成特定的實例。
1 template void Swap<int>(int, int); // 用<>指定類型,在聲明前加template
它的語義爲「使用Swap()模板生成int類型的函數定義」。
與顯式實例化不一樣的是,顯式具體化使用下面兩個等價的聲明之一:
1 template<> void Swap<int>(int, int); 2 template<> void Swap(int, int);
它們的語義是,「不要使用Swap模板來生產函數定義,而應使用專門爲int類型顯示地定義的函數定義」。
2一、還能夠在程序中建立顯式實例化:
1 template <class T> 2 T Add(T a, T b){ return a + b; } 3 int m = 6; 4 double n = 9.8; 5 cout << Add<double>(m, n) << endl;
因爲這裏顯示實例化中的特定類型爲double,因此變量m會被強制類型轉換成double類型。
2二、對於函數重載,函數模板,函數模板重載,C++將選擇哪一個版本?
請看這裏---------> C++ 函數重載,函數模板和函數模板重載,選擇哪個?
2三、C++11,在函數模板中,當沒法得知一個變量的值時,可使用decltype關鍵字來決定返回值類型:
1 template<class T1, class T2> 2 void ft(T1 x, T2 y) 3 { 4 decltype(x+y) xpy = x + y; // 此時xpy的類型就是x+y後的類型 5 }
2四、decltype關鍵字本質上更復雜一些,編譯器必須遍歷一個核對錶去肯定類型,如今有以下聲明:
1 decltype(expression) var;
第一,expression是一個沒有用括號括起來的標識符,則var的類型與該標識符相同,包括const等限定符。
第二,若是expression是一個函數調用,則於與函數的返回值相同,這裏並不執行函數,只是查看返回值類型。
第三,若是expression是一個左值,而且expression是被括號括起的,var會是引用類型,不然第一步就會處理。
第四,到了這裏,var的類型只能與expression相同。
2五、C++11,在函數模板中,當沒法得知返回值類型時,通常不能夠直接使用關鍵字decltype來獲得返回值類型,由於此時每每decltype後面表達式中的變量還不在做用域內,此時,須要使用後置返回類型。
1 template<class T1, class T2> 2 auto gt(T1 x, T2 y) -> decltype(x+y) // 此時x,y已在做用域內 3 { 4 return x + y; 5 }
auto表示是一個佔位符,表示後置返回類型提供的類型。