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