你怎麼看 C++11(新的 C++ 標準)裡面的變化?
http://developers.solidot.org/article.pl?sid=11/06/22/1058208
http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/C++作者Bjarne Stroustrup最近說,C++11就像一門新語言。確實,C++的核心有重大變化。現在它支持Lambda 表達式,對象自動類型推導,委託構造函數(delegate constructor),控制默認函數,nullptr,原生字元串標識,右值引用,等等。
c++是越改進越好,而不是怪獸,越來越有c++的語言風格,系統設計的精髓也越來越能體現。
我們翻譯了C++11 FAQ的中文版(http://chenlq.net/cpp11-faq-chs),給我的感覺是,C++11主要在兩個方面對C++做了改進
其一,改善易用性,比如上面提到的auto,decltype關鍵字,智能指針,Lambda表達式,原生字元串標識等等,都是為了改善C++的易用性,提高其開發效率。其二,就是進一步提高性能,這包括右值引用,對並行計算的支持,對標準庫的大規模改寫等等。總體而言,語法是有點越來越複雜了,感覺有點類似Java了
但是對並行計算的支持,我覺得這是C++11最令人動心的地方看過很多遍這個:http://en.wikipedia.org/wiki/C%2B%2B0x。我的感覺:上帝要讓C++滅亡,先要讓它瘋狂。
- 對平常寫代碼比較深刻的影響有:auto的使用,以及與decltype的聯合使用,舉一個關於使用追蹤返回類型函數的比較猛的例子:
-
- int (*(*fun1())()){return nullptr;}對於這樣一個函數的定義,簡直是令人暈眩的!這個例子挺有可能用來作為面試題的,哈哈!首先我們認識下什麼叫函數指針,比如這樣的int (*t)(double),t就是一個函數指針,指向的函數的返回值是int,指向函數的參數為double。我們分析這個函數的定義,fun1函數返回了一個函數指針int(*(*())()),而這個函數指針的返回值也是個函數指針,int (*)()。
- 我們使用auto的定義是這樣的auto fun2()-&>auto (*)()-&>int (*)() {reurn nullptr;} ,多麼迷人的用法啊!
- [capture]:中文名捕捉列表,捕捉列表是出現在lambda的開始處,即使為空也要寫上[],因為這個符號告訴編譯器,這裡是lambda表達式的開始。捕捉列表,顧名思義,就是用來抓獲在上下文中的一些值,好讓我在這個lambda表達式裡面使用。就是避免往參數列表裡傳入太多的參數。
- (parameters):參數列表,類似於函數,但是lambda表達式在無參數的時候可以省略,即不包含這個項目。但是有一種特殊情況無法滿足,參加下面一個關鍵字。
- mutable,這個時可選的,可寫可不寫,不寫的話lambda函數就默認是一個const函數,mutable是用來取消常量性的。使用了這個修飾符,那麼參數列表就不能省略,哪怕沒有任何參數。
- -&>return_type:返回類型,無返回類型時也可以省略。
- {statement}:函數體,與普通函數類似。
其實lambda表達式看下來就是這個捕捉列表讓人捉摸不透。可以通過:
- [var]表示值傳遞捕捉var
- [=]值傳遞捕獲父作用域中所有的變數。
- [var]引用方式捕獲var
- []引用方式捕獲父作用域中所有的變數。
- [this]值傳遞捕獲當前的this指針。
塊作用域外的lambda表達式列表必須為空。還有就是仿函數與lambda的關係,其實仿函數是編譯器實現lambda的一種方式。在函數中定義lambda有個非常優秀的地方,父函數結束後lambda就不可用了,不會污染任何名空間。
- 還有就是智能指針,現在可以使用unique_ptr和shared_ptr,以及weak_ptr,比C++98時代的auto_ptr好用多了.
- 右值引用的出現,提高效率,減少臨時變數的析構耗時。
- 還有就是常量表達式,基於範圍的for循環,原子類型處理並發問題,強枚舉類型,列表初始化等等這些小的細節部分
挺好的,寫起代碼來更加容易,比如Delegate Constructor, R-Value 等等. 就是不知道什麼時候編譯器能夠正式支持。GCC僅支持一部分。
說C++太複雜的人其實應該仔細想想,C++中到底有什麼特性是在其它語言中找不到的呢?如果這些特性在其它語言中存在,那又有什麼理由說C++太複雜呢?現實世界是複雜的,無論你用什麼語言描述現實世界中的問題,複雜性不會自己消失,要麼用一個複雜的語言,要麼用一個簡單的語言+複雜的庫/代碼。
彙編語言夠簡單,但是彙編寫的幾十萬行程序你願意讀么?
我感覺11的很多新特性還是非常有用的,但是語言用的符號實在太丑了。
很好的改進,有幾樣東西要掌握:智能指針,function/bind,Lambda。
c++標準宕機了十年左右,終於開始向著「具有現代特性和設施的編程語言」的目標努力了。不是一朝一夕能趕上的,但是c++的改變我們能看到。obj-c有at宏,c++有自定義後綴;obj-c有arc,c++有智能指針。
c++的確為了兼容c保留了很多原始的東西,這部分坑在慢慢填。我們可以看到從最開始的vector和string,到11開始的智能指針以及std::thread、std::atomic,以及std::function和lambda,還有以後即將到來的asio,多了許多替代方案。不久的將來,線程和並發編程在c++里不再是「魔法」,我們也不需要使用pthread那些平台相關的api了。
再有就是現有教程和編譯器的實現需要跟上。要不然一部分初學者還是會先接觸原生的數組和指針,不僅寫的代碼沒法看,還會喪失興趣。
c++最終會變成易學易用,開發效率高的這麼一種語言,我們在需要注重業務邏輯的時候可以使用功能充足的、封裝好的標準庫和三方庫,完全不需要管堆中對象的釋放這一回事。雖然這樣會使C++的門檻大幅下降,就像現在的iOS培訓班那樣,但對於一門語言的發展和生態構建,必定是有利的。C++ 11 的變化是給 C++ compiler 加了一個 _NO_CPP0X 的編譯參數。而且成為最受歡迎的參數。
對於絕大多數普通程序員,C++11是重大核心改進,14和17屬於錦上添花。
C++11讓C++在怪獸的路上走的更遠,把其他語言遠遠甩在後面,你再也不會見著一門語言,複雜至此。。。
執行效率優勢和之前版本沒有太大區別,編譯器複雜性進一步上升,開發人員學習成本急劇提高。
推薦《深入理解c++11——c++11新特性解析與應用》這本書其他廢話不多說了。
之前畢設用了幾個新特性來寫程序,感覺還是很不錯的,特別是加入了正則表達式的支持,auto和in這兩個關鍵字也很棒,用了只能指針媽媽再也不用擔心內存泄漏了。。。
其實,我更關心發布後,IDE的支持情況。
c++ 98 到現在十幾年了,也是時候再進化一次。不過感覺委員會的人都比較保守,或者說,認為保持向下兼容性最重要,因此對激進派來講,變得還不夠。
推薦閱讀:
※我們需不需要跟進C++11/14?
※double 和 long double 有哪些區別?
※C++ 11會帶來什麼影響?