程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++11較C++03的改進

C++11較C++03的改進

編輯:C++入門知識

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 
#include 
#include 
#include 

using namespace std;

map>> name_languages_year {
    {"Dennis Ritchie",    {{"B",      1969}, {"C",        1973}}},
    {"Niklaus Wirth",     {{"Pascal", 1970}, {"Modula-2", 1973}, {"Oberon", 1986}}},
    {"Bjarne Stroustrup", {{"C++",    1983}}},
    {"Walter Bright",     {{"D",      1999}}}
};
// 注意為了匹配template  列表的嵌套方式。

cout << name_languages_year["Niklaus Wirth"].at(0).first << endl; // prints `Pascal'

// adds a new entry to the map
name_languages_year["John McCarthy"] = {
    {"Lisp", 1958}
};
// 注意此處並沒有顯式的類型

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的功能部分支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved