你該關(guān)注C++11嗎录肯?
很明顯,C++11為C++帶來了大量的新特性试伙。C++11將修復(fù)大量缺陷和降低代碼拖沓嘁信,比如lambda表達(dá)式的支持將使代碼更簡(jiǎn)潔。像移動(dòng)語義這種特性會(huì)提高語言內(nèi)核的基礎(chǔ)效率疏叨,使你可以寫出更快的代碼潘靖。對(duì)模板系統(tǒng)的優(yōu)化可以使你更容易寫出泛型的代碼。
新的標(biāo)準(zhǔn)庫(kù)同時(shí)也會(huì)包含新的特性蚤蔓,包括對(duì)多線程的支持和優(yōu)化智能指針卦溢,后者將給那些還沒用類似于boost::shared_ptr的人提供更簡(jiǎn)單的內(nèi)存管理方法。
我已經(jīng)開始使用新的C++11特性秀又,并且非常喜歡:新的auto關(guān)鍵字单寂,對(duì)模板”>>“寫法的支持,lambda表達(dá)式和新的函數(shù)定義語法吐辙。
C++11是如何開發(fā)出來的宣决?
C++11的出現(xiàn),首先要感謝C++標(biāo)準(zhǔn)委員會(huì)的辛勤工作昏苏,一群來自學(xué)術(shù)界和工業(yè)界的專家尊沸,他們的多次會(huì)晤攻克難題威沫,終于設(shè)計(jì)出了一種跨平臺(tái),被多種編譯器支持洼专,可以生成高效易維護(hù)代碼的語言棒掠。而C++11新標(biāo)準(zhǔn),就像對(duì)靈活強(qiáng)大的C++的一次不可思議的擴(kuò)展屁商。
C++11包括什么烟很?
更易用的語言
使用過C++11后,我發(fā)現(xiàn)它提供了大量的基礎(chǔ)方法使C++變成了一種更易使用的語言蜡镶。這不是說它變成了簡(jiǎn)單的語言—這里有大量的新特性—提供了大量的方法使編程更容易雾袱。讓我們看一個(gè)例子,auto關(guān)鍵字帽哑。在C++11中谜酒,假如編譯器可以從變量的初始化中得到它的類型叹俏,那么你不必要指定類型妻枕。比如:
編譯器可以推導(dǎo)出y的類型是int。當(dāng)然粘驰,這不是一個(gè)證明auto有用的一個(gè)閃亮的例子屡谐。當(dāng)使用模板特別是STL時(shí)auto很好用。為什么這么說蝌数,想象使用一個(gè)迭代器(iterator):
現(xiàn)在你想遍歷address_book中的元素愕掏,要這樣做,你需要一個(gè)迭代器:
map::iteratoriter=address_book.begin();
這是一個(gè)恐怖的長(zhǎng)類型聲明顶伞,當(dāng)你已經(jīng)知道這個(gè)類型的時(shí)候饵撑。這樣是不是簡(jiǎn)潔多了:
auto ? iter=address_book.begin();
代碼變得更簡(jiǎn)單明了,我覺得可讀性也更高了唆貌,因?yàn)槟0逭Z法使這一行其它內(nèi)容變模糊了滑潘。這是我特別喜歡的一個(gè)特性,我發(fā)現(xiàn)它消除了許多頭疼和難以追蹤的編譯錯(cuò)誤锨咙,節(jié)省了時(shí)間而沒有丟掉表達(dá)式的意思语卤。
區(qū)間迭代(range-based for loop)
下面迭代器的例子是C++11提供的一種處理迭代的更好方法,有些人叫做區(qū)間迭代(基本上所有的現(xiàn)代語言都支持)酪刀。這個(gè)例子足夠證明這種語法是多么優(yōu)雅:
vectorvec;vec.push_back(10);vec.push_back(20);for(int&i:vec){cout<
你需要做的就是給出一個(gè)變量和要迭代的區(qū)間粹舵。但是如果你想迭代一個(gè)map怎么辦?你怎么設(shè)置map中值的類型骂倘?你知道vector值的類型是int眼滤。但map的值類型是pair,通過.first和.second給你提供鍵和值历涝。但是用auto诅需,你根本無需關(guān)心確切類型情妖,你可以簡(jiǎn)單的寫成:
for(autoaddress_entry:address_book){cout<
這將打印出:這是一個(gè)不錯(cuò)的C++11新特性組合用法吧?
我這里還有更易用的優(yōu)化—在以前的C++標(biāo)準(zhǔn)中诱担,假如你寫一個(gè)含有其他模板類型的模板:
vector>vector_of_int_vectors;
你必須在結(jié)束的兩個(gè)’>‘之間添加空格毡证。這不僅煩人,而且當(dāng)你寫成>>而沒有空格時(shí)蔫仙,你將得到困惑和誤導(dǎo)的編譯錯(cuò)誤信息料睛。產(chǎn)生這種行為的原因是C++詞法分析的最大匹配原則(maximal munch rule)。一個(gè)好消息是從今往后摇邦,你再也不用擔(dān)心了:
vector>vector_of_int_vectors;
對(duì)恤煞,這確實(shí)是個(gè)小東西,不過卻是人工代碼克服機(jī)器工具的勝利施籍。另外居扒,這樣寫就不那么丑了。
多線程
這是第一次丑慎,C++11將包含一種內(nèi)存模型和對(duì)應(yīng)的多線程庫(kù)喜喂,這意味著你將可以編寫符合標(biāo)準(zhǔn)的多線程代碼。新標(biāo)準(zhǔn)將提供所有的通用線程方法竿裂,比如線程玉吁、線程局部存儲(chǔ)和原子操作。它也提供了一系列有趣的特性:futures和promises腻异。futures和promises的主要思想是进副,你可以編寫代碼表示,“這個(gè)對(duì)象悔常,一個(gè)future代碼還沒計(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ì)劃在這一系列文章中深入探索這些特性,包括:
如何用auto九秀、decltype和新的函數(shù)語法編寫更好的代碼
右值引用和移動(dòng)語義
nullptr和強(qiáng)類型的枚舉
C++11的編譯器支持
當(dāng)然遗嗽,如果無法使用再好的語言特性又有什么用,好消息是大量的編譯器已經(jīng)開始支持C++11鼓蜒。Apache基金會(huì)整理了一個(gè)列表痹换,列出了C++11的語言特性和編譯器的支持情況:支持C++11的編譯器征字。假如你對(duì)GCC感興趣,這里有GCC4.7支持C++11娇豫。
有些編譯器匙姜,比如GCC,不會(huì)默認(rèn)支持這些新特性—例如冯痢,為了支持C++11特性氮昧,編譯時(shí)必須指定 -std=c++0x。當(dāng)然這也是很有用的浦楣,你可以在你的項(xiàng)目中選擇編譯器和語言集袖肥。