什么是C++0x?C++0x是C++最新標準標準化過程中的曾用名,,在這一系列文章中我們將介紹最新標準添加的一系列新的語言特性,。在2011年9月份,C++0x正式由官方發(fā)布并命名C++11,,現(xiàn)在很多編譯器已經(jīng)支持了部分C++11特性,。 C++11包括大量的新特性:主要特征像lambda表達式和移動語義,實用的類型推導關鍵字auto,,更簡單的容器遍歷方法,,和大量使模板更容易使用的改進。這一系列教程將包含所以以上特性,。 你該關注C++11嗎,?很明顯,C++11為C++帶來了大量的新特性,。C++11將修復大量缺陷和降低代碼拖沓,,比如lambda表達式的支持將使代碼更簡潔。像移動語義這種特性會提高語言內核的基礎效率,,使你可以寫出更快的代碼。對模板系統(tǒng)的優(yōu)化可以使你更容易寫出泛型的代碼,。 新的標準庫同時也會包含新的特性,,包括對多線程的支持和優(yōu)化智能指針,后者將給那些還沒用類似于boost::shared_ptr的人提供更簡單的內存管理方法,。 我已經(jīng)開始使用新的C++11特性,,并且非常喜歡:新的auto關鍵字,對模板”>>“寫法的支持,,lambda表達式和新的函數(shù)定義語法,。 C++11是如何開發(fā)出來的?C++11的出現(xiàn),,首先要感謝C++標準委員會的辛勤工作,,一群來自學術界和工業(yè)界的專家,他們的多次會晤攻克難題,,終于設計出了一種跨平臺,,被多種編譯器支持,可以生成高效易維護代碼的語言,。而C++11新標準,,就像對靈活強大的C++的一次不可思議的擴展。 C++11包括什么,?更易用的語言使用過C++11后,,我發(fā)現(xiàn)它提供了大量的基礎方法使C++變成了一種更易使用的語言,。這不是說它變成了簡單的語言—這里有大量的新特性—提供了大量的方法使編程更容易。讓我們看一個例子,,auto關鍵字,。在C++11中,假如編譯器可以從變量的初始化中得到它的類型,,那么你不必要指定類型,。比如,你可以這樣寫:
編譯器可以推導出y的類型是int,。當然,,這不是一個證明auto有用的一個閃亮的例子。當使用模板特別是STL時auto很好用,。為什么這么說,,想象使用一個迭代器(iterator):
現(xiàn)在你想遍歷address_book中的元素,要這樣做,,你需要一個迭代器:
這是一個恐怖的長類型聲明,,當你已經(jīng)知道這個類型的時候。這樣是不是簡潔多了:
代碼變得更簡單明了,,我覺得可讀性也更高了,,因為模板語法使這一行其它內容變模糊了。這是我特別喜歡的一個特性,,我發(fā)現(xiàn)它消除了許多頭疼和難以追蹤的編譯錯誤,,節(jié)省了時間而沒有丟掉表達式的意思。 區(qū)間迭代(range-based for loop)下面迭代器的例子是C++11提供的一種處理迭代的更好方法,,有些人叫做區(qū)間迭代(基本上所有的現(xiàn)代語言都支持),。這個例子足夠證明這種語法是多么優(yōu)雅:
你需要做的就是給出一個變量和要迭代的區(qū)間。但是如果你想迭代一個map怎么辦,?你怎么設置map中值的類型,?你知道vector值的類型是int。但map的值類型是pair,,通過.first和.second給你提供鍵和值,。但是用auto,你根本無需關心確切類型,,你可以簡單的寫成:
這將打印出:
這是一個不錯的C++11新特性組合用法吧,? >>(right angle brackets)我這里還有更易用的優(yōu)化—在以前的C++標準中,假如你寫一個含有其他模板類型的模板:
你必須在結束的兩個’>‘之間添加空格,。這不僅煩人,,而且當你寫成>>而沒有空格時,你將得到困惑和誤導的編譯錯誤信息。產(chǎn)生這種行為的原因是C++詞法分析的最大匹配原則(maximal munch rule),。一個好消息是從今往后,,你再也不用擔心了:
對,這確實是個小東西,,不過卻是人工代碼克服機器工具的勝利,。另外,這樣寫就不那么丑了,。 多線程這是第一次,,C++11將包含一種內存模型和對應的多線程庫,這意味著你將可以編寫符合標準的多線程代碼,。新標準將提供所有的通用線程方法,,比如線程、線程局部存儲和原子操作,。它也提供了一系列有趣的特性:futures和promises,。futures和promises的主要思想是,你可以編寫代碼表示,,“這個對象,,一個future代碼還沒計算完的結果”,它將可以在后臺計算結果,。當這個值需要的時候,,你向future發(fā)請求,假如這個值準備好了,,那就可以得到它,,要不然繼續(xù)等待。 我將在后續(xù)的文章中深入探討多線程,。 還有好多其他的東西C++11特性的數(shù)量是客觀的。你可以閱讀維基百科里的C++11頁面,,而我計劃在這一系列文章中深入探索這些特性,,包括:
C++11的編譯器支持當然,,如果無法使用再好的語言特性又有什么用,,好消息是大量的編譯器已經(jīng)開始支持C++11。Apache基金會整理了一個列表,,列出了C++11的語言特性和編譯器的支持情況:支持C++11的編譯器,。假如你對GCC感興趣,這里有GCC4.7支持C++11,。 有些編譯器,,比如GCC,不會默認支持這些新特性—例如,為了支持C++11特性,,編譯時必須指定 -std=c++0x,。當然這也是很有用的,你可以在你的項目中選擇編譯器和語言集,。
from:http:///blog/2013/08/01/what-is-cpp11/ |
|