-
1 # 成都朗沃教育
-
2 # 你差不多得了
這是個好問題,我在給公司做內部培訓的時候,C++11是個兩小時的大課程。
Lambda是個很讚的新特性,可以理解為函式物件的語法糖。但有它在之後標準演算法庫如虎添翼,因為很多標準演算法庫都接受一個callable物件,有了lambda就可以inplace地填引數,又方便又清晰。
智慧指標也很贊,+unique_ptr, +shared_ptr, -auto_ptr。unique_ptr很棒地解決了物件ownership的傳遞問題,編譯器在每次轉移ownership的時候都強制你寫std::move(),讓你一眼就知道什麼時候物件交給了誰。解構函式讓你不用自己寫delete,C++14的make_unique又幫你省了new,就這倆就能幹掉大部分的記憶體問題。
Ranged for loop, 就是for (auto& e : c),讓容器遍歷變得簡單無比。
std::function, 將函式簽名R(A, B)和實現方法(普通函式,類成員函式,函式物件) decouple開了。這讓面向介面程式設計變得更加容易了,也讓編譯錯誤變得容易讀了不少。
-
3 # jwzhang0809
首先恭喜你,這個面試官本身是懂技術的,而且知道採取正確的方案。那麼也就意味著,你可能的未來領導或者能給技術或人生路以幫助。
咱們再看面試的回答,面試本身是為了後續工作需要,所以也不用那麼文縐縐和全面。支援相對03而言,一般性應用領域的實戰中他特別有用的方面:
1. 函式物件化(std:function),相對而言可以認為是在OO,範型之外,補上的一大塊版(是不是覺得,lua和js函式作為第一首物件,寫起來很爽呢?)。
2. auto/range for/lamba/初始化列表等使得書寫非常方便,也能降低思維負擔。
3. thread庫的新增,抽象的很好,比一般第三方或個人作品,方便實用。還有右值,emplace等的引入,能幫助效能提升和書寫自然。
4.模板可變參的引入,使得程式碼更易書寫和維護。
5. 真正意義上的原子操作概念和抽象,雖然用的不多。
6. 其它一些小周邊的庫改進,實際開發中也會受益。(比如string/vector的介面)
7. 文字字元定義的支援(比如:可以自己引入“公里”、“千克”、“牛頓”等概念),不過,一般應用裡很少用。
回覆列表
革新語法糖標準庫的擴充老語法bug的fixed
面試官最想聽的肯定是第1點,然後第2點。沒得聊了就聊第3點、第4點。
1. 革新有啥呢?很多啊。一言以蔽之是啥?——模板。模板肯定不是C++的新事物,但C++11的很多革新確實是圍繞模板展開的,或者說都能和模板搭上點曖昧關係。。(個人感覺智慧指標真的沒什麼好談的,想裝逼,談模板)
decltype關鍵字,編譯期推導表示式型別。
可變引數模板(class...、typename... ),這真是超程式設計強有力的幫手。
函式模板的預設模板引數(叫做語法糖,似乎也可以);模板的別名(這個其實真的是語法糖了)
然後就是幾乎你不說,面試官也可能會問你的右值引用(&&),move語義(std::move)和完美轉發(std::forward<T>(t))啦。它們的出現除了進一步提升了C++的效能,另外你能說它和模板一點關係都沒有?
綜上,自此C++程式設計終於從一門嚴肅的程式語言開始轉向腦筋急轉彎了。。
函式物件的概念被擴充了,,不過我感覺都算語法糖吧。
另外還有一個小點——nullptr。。也算是小革新吧,C語言指標的鍋該甩了。。另外nullptr真不屬於語法糖,這tm要算也應該算個 bug fixed吧。。
2. 語法糖有啥呢?列舉幾個:比如auto關鍵字(自動型別推導),配合容器、迭代器、“各種”函式物件使用簡直不要太好。
lambda表示式(匿名函式物件),你可以將其理解為語法革新,但我傾向於它是一種語法糖。因為它要解決的工程問題,C++11之前基本也能做,但比較麻煩,有了lambda則變得十分高效簡潔了。
初始化引數列表。。這個肯定也是不得不說的一個語法糖了。。C++真的是向指令碼語言學習了很多。。
類的非靜態成員在宣告時賦值。。Java程式設計師肯定笑了。
模板的別名。。恩,又說了一遍。。
3. 標準庫的擴充這個其實沒啥好談的,無法就是將boost庫裡幾個備胎轉正了。比如智慧指標shared_ptr、unique_ptr。另外weak_ptr(本質上不上智慧指標,只是shared_ptr的助手),而auto_ptr則是在C++11之前就存在的,現在基本棄用。。還有就是bind啦,並非是unix中socket操作的那個bind哈!而是和快速組裝一個函式物件的bind繫結器。
另外就是標準庫終於有了“雜湊容器”,只是它的名字叫unordered_map/unordered_set/……,並非是hash_map/hash_set/……,(可能是因為hash字首的容器名被第三方庫給用爛了,介面又不統一。C++標準委員會只能無奈給孩子改名了,逃)。
還新增了一個容器——元組(tuple)。。感覺也是從指令碼語言處得到的inspire吧。。
執行緒庫第一次被納入到公眾庫中,從此C++不再需要使用Unix C的API來處理執行緒和非同步啦。當然你把執行緒庫,看做是革新或許也是合理的。
其他新增庫還有很多,比如時間日期庫——chrono,還有新增了很多演算法。。不一一介紹了。
4. bug的fixed最容易想到的就是模板的>>中間不需要加空格了。。。其他的bug fixed,我拋磚引玉請網友們補充吧(其實一時之間,真的窮舉不出來了。。囧)。當然了C++的bug肯定還是存在的,每當你新標準解決了上一代的bug,但是在增加新特性的同時,卻會引入更多的bug。。