0 C++11
C++11又稱為C++0x是新的C++語言的標准,發布於2011年。新的標准取代了2003年發布的C++03,也為C++帶來了些許改進。
1 關鍵詞auto修訂
一門語言如果太啰嗦了,不僅會為閱讀帶來障礙,而且還是許多錯誤的根源。所以從C語言繼承而來的關鍵詞auto在C++11中有了新的定義,可以進行自動類型推斷。
例如:
// C++03 方式
for (std::vector::const_iterator ci = v.begin(); ci != v.end(); ++ci);
// C++11 方式
for (auto ci = v.cbegin(); ci != v.cend(); ++ci);
// 注意 cbegin() 和 cend() 返回一個 const_iterator
需要謹慎的一些應用。
auto x = 10.0;
// 如果將 `10.0' 變換為 `10', x 將變為一個整型變量
// 此處可能會給依賴於它的重載函數帶來困擾
// 因此,建議1:利用auto消除繁瑣而不是用來保持一致性
for (auto i = 0ul; i < v.size(); ++i);
// 此處 auto i = 0ul 相當於 `unsigned long int i=0'
// 建議 2: 不要針對特定類型使用auto,因為那樣做會給你帶來不少問題
// 建議 3: 針對建議1和2,不要對常量使用auto
2 for()的循環范圍
迭代操作在STL中是很常見的。C++11提供了一個專門的for函數來簡化那些以begin()、end()為參數並返回迭代器的函數。這種新的方式對於C的數組同樣有效。
例子:
// the C++03 way
for (std::vector::iterator i = v.begin(); i != v.end(); ++i);
// the C++11 way
for (int &item: v);
// item 將從v的begin()執行到v的end()
// 注意這裡的引用,它允許我們改變v中的內容
for (const int &item: v); // 這時不能改變內容,引用可以提速
for (int item: v); // 通過傳值,不能改變v中內容
3 初始化列表
C++03中的容器不能像C中的數組那樣利用列表初始化,這個問題在C++11中得到改進。
例如:
// C arrays
char array1[] = {'A', 'B'};
double array2[] = {32.0, 6.003, -0.1};
// C++03 vectors
std::vector cpp03vector1;
cpp03vector1.push_back('A');
cpp03vector1.push_back('B');
std::vector cpp03vector2(3);
cpp03vector2[0] = 32.0;
cpp03vector2[1] = 6.003;
cpp03vector2[2] = -0.1;
// C++11 vectors
std::vector cpp11vector1 = {'A', 'B'};
std::vector cpp11vector2 = {32.0, 6.003, -0.1};
// or...
std::vector cpp11vector3{'A', 'B'};
std::vector cpp11vector4{32.0, 6.003, -0.1};
// 注意這種方式也適用於STL中的其他容器, 不僅僅是std::vector
列表初始化也可以運用在更復雜的結構中,如下所示:
#include
4 C++數組
貌似這塊兒是C++11添加的新的功能。
C++11提供了std::array,目的是來取代C中的數組。這是個尺寸可變的輕量級數組,使用的時候效果與std::vector差不多。
例子:
#include
// C arrays
char carray1[] = "Abc"; // caution, an unseen '\0' is added to the end
float carray2[] = {0.2f, 33.33f};
// C++ arrays
std::array cpparray1{{'A', 'b', 'c'}};
std::array cpparray2{{0.2f, 33.33f}};
// 關注點 1: 尺寸在編譯的時候推導
// 關注點 2: 數組尺寸不可變
// 關注點 3: 括號裡的類型由參數列表決定
// 新舊數組的對比
std::cout << sizeof carray1 - 1; // -1 因為額外的 '\0'
std::cout << sizeof carray2 / sizeof (float); // 元素的個數 != 字節數
std::cout << cpparray1.size();
std::cout << cpparray2.size();
carray2[-5] = 0.1f; // 下溢
cpparray2.at(-5) = 0.1f; // throws std::out_of_range 異常
// C++ arrays 比 C arrays好的原因有很多,從上述代碼可見一斑
5 少許修正
C++03中的一些小缺陷在C++11中得到了修正。
例如:
1
set>在C++11中可以編譯了。(注意最後兩個尖括號之間沒有空間哦)
2 std::string 有了front和back成員函數。
3 文件流可以接受std::string類型的文件名,意味著我們不再需要使用可笑的c_str()進行轉換。
4 可以很方便的將數值想std::string進行類型轉換。通過以下重載函數:
string to_string(int)
string to_string(float)
string to_string(double)
...
6 支持C++11的編譯器
1 GNU C++ 編譯器需要加入 -std=c++0x 來編譯 C++11 代碼。
2 Visual Studio 2010部分支持C++11特性。
3 Visual Studio 201X(V11)仍然只對C ++11的功能部分支持。