1. 程式人生 > >C++11系列-什麽是C++11

C++11系列-什麽是C++11

證明 需要 特性 泛型 枚舉 聲明 繼續 特征 線程

什麽是C++0x?

C++0x是C++最新標準標準化過程中的曾用名,在這一系列文章中我們將介紹最新標準添加的一系列新的語言特性。在2011年9月份,C++0x正式由官方發布並命名C++11,現在很多編譯器已經支持了部分C++11特性。

C++11包括大量的新特性:主要特征像lambda表達式和移動語義,實用的類型推導關鍵字auto,更簡單的容器遍歷方法,和大量使模板更容易使用的改進。這一系列教程將包含所以以上特性。

你該關註C++11嗎?

很明顯,C++11為C++帶來了大量的新特性。C++11將修復大量缺陷和降低代碼拖沓,比如lambda表達式的支持將使代碼更簡潔。像移動語義這種特性會提高語言內核的基礎效率,使你可以寫出更快的代碼。對模板系統的優化可以使你更容易寫出泛型的代碼。

新的標準庫同時也會包含新的特性,包括對多線程的支持和優化智能指針,後者將給那些還沒用類似於boost::shared_ptr的人提供更簡單的內存管理方法。

我已經開始使用新的C++11特性,並且非常喜歡:新的auto關鍵字,對模板”>>“寫法的支持,lambda表達式和新的函數定義語法。

C++11是如何開發出來的?

C++11的出現,首先要感謝C++標準委員會的辛勤工作,一群來自學術界和工業界的專家,他們的多次會晤攻克難題,終於設計出了一種跨平臺,被多種編譯器支持,可以生成高效易維護代碼的語言。而C++11新標準,就像對靈活強大的C++的一次不可思議的擴展。

C++11包括什麽?

更易用的語言

使用過C++11後,我發現它提供了大量的基礎方法使C++變成了一種更易使用的語言。這不是說它變成了簡單的語言—這裏有大量的新特性—提供了大量的方法使編程更容易。讓我們看一個例子,auto關鍵字。在C++11中,假如編譯器可以從變量的初始化中得到它的類型,那麽你不必要指定類型。比如,你可以這樣寫:

int x = 3;
auto y = x;

編譯器可以推導出y的類型是int。當然,這不是一個證明auto有用的一個閃亮的例子。當使用模板特別是STL時auto很好用。為什麽這麽說,想象使用一個叠代器(iterator):

map<string, string> address_book;
address_book["Alex"] = "[email protected]";
//add a bunch of people to address_book

現在你想遍歷address_book中的元素,要這樣做,你需要一個叠代器:

map<string, string>::iterator iter = address_book.begin();

這是一個恐怖的長類型聲明,當你已經知道這個類型的時候。這樣是不是簡潔多了:

auto iter = address_book.begin();

代碼變得更簡單明了,我覺得可讀性也更高了,因為模板語法使這一行其它內容變模糊了。這是我特別喜歡的一個特性,我發現它消除了許多頭疼和難以追蹤的編譯錯誤,節省了時間而沒有丟掉表達式的意思。

區間叠代(range-based for loop)

下面叠代器的例子是C++11提供的一種處理叠代的更好方法,有些人叫做區間叠代(基本上所有的現代語言都支持)。這個例子足夠證明這種語法是多麽優雅:

vector<int> vec;
vec.push_back(10);
vec.push_back(20);

for (int &i: vec)
{
    cout<<i;
}

你需要做的就是給出一個變量和要叠代的區間。但是如果你想叠代一個map怎麽辦?你怎麽設置map中值的類型?你知道vector值的類型是int。但map的值類型是pair,通過.first和.second給你提供鍵和值。但是用auto,你根本無需關心確切類型,你可以簡單的寫成:

for (auto address_entry: address_book)
{
    cout<<address_entry.first<<" "<address_entry.second<<endl;
}

這將打印出:

Alex [email protected]

這是一個不錯的C++11新特性組合用法吧?

>>(right angle brackets)

我這裏還有更易用的優化—在以前的C++標準中,假如你寫一個含有其他模板類型的模板:

vector<vector<int> > vector_of_int_vectors;

你必須在結束的兩個’>‘之間添加空格。這不僅煩人,而且當你寫成>>而沒有空格時,你將得到困惑和誤導的編譯錯誤信息。產生這種行為的原因是C++詞法分析的最大匹配原則(maximal munch rule)。一個好消息是從今往後,你再也不用擔心了:

vector<vector<int>> vector_of_int_vectors;

對,這確實是個小東西,不過卻是人工代碼克服機器工具的勝利。另外,這樣寫就不那麽醜了。

多線程

這是第一次,C++11將包含一種內存模型和對應的多線程庫,這意味著你將可以編寫符合標準的多線程代碼。新標準將提供所有的通用線程方法,比如線程、線程局部存儲和原子操作。它也提供了一系列有趣的特性:futures和promises。futures和promises的主要思想是,你可以編寫代碼表示,“這個對象,一個future代碼還沒計算完的結果”,它將可以在後臺計算結果。當這個值需要的時候,你向future發請求,假如這個值準備好了,那就可以得到它,要不然繼續等待。

我將在後續的文章中深入探討多線程。

還有好多其他的東西

C++11特性的數量是客觀的。你可以閱讀維基百科裏的C++11頁面,而我計劃在這一系列文章中深入探索這些特性,包括:

  • 如何用auto、decltype和新的函數語法編寫更好的代碼
  • Lambda表達式
  • 區間叠代
  • 常量表達式
  • 右值引用和移動語義
  • nullptr和強類型的枚舉

C++11的編譯器支持

當然,如果無法使用再好的語言特性又有什麽用,好消息是大量的編譯器已經開始支持C++11。Apache基金會整理了一個列表,列出了C++11的語言特性和編譯器的支持情況:支持C++11的編譯器。假如你對GCC感興趣,這裏有GCC4.7支持C++11。

有些編譯器,比如GCC,不會默認支持這些新特性—例如,為了支持C++11特性,編譯時必須指定 -std=c++0x。當然這也是很有用的,你可以在你的項目中選擇編譯器和語言集。

from:http://towriting.com/blog/2013/08/01/what-is-cpp11/

C++11系列-什麽是C++11