C++ 11 輕鬆上手
前言
前些日子聽到群里有些弟兄說傳統的C++跟C++ 11到底差別在哪裡?!於是,萌發了寫這篇玩藝的念頭.當然,這是給菜/中鳥寫的,老鳥請選擇無視或者自行迴避!然後,其實也不太適合菜鳥看,至少應該是對傳統C++有所認識了,就是介乎於C++ 03和C++ 11,總覺得好像有什麼沒搞明白的中鳥們.
確實傳統的C++咱又不是不能用,而且用習慣了順手了沒覺得哪裡有毛病,那何苦要搞什麼C++ 11,什麼C++ 14的,甚至現在都在定製C++ 17的標準.美帝凈忽悠咱們天朝屁民,還一群屁孩後面吵著鬧著這個好啊那個強,這嚷嚷了半天,這好在哪裡?看書吧,看博客吧,那都抽象到要死,看的時候好像懂了,到用的時候就懵了.
好,我們今天就用跟C++ 03對比的方式來瞧瞧C++
11到底都有啥新鮮玩藝.反正呢,我看完了C++ 11新特性,感覺就一句話:懶人改變世界!另外,為簡單起見,這裡並沒有涉及到C++
11在模板里的應用. 即這裡不會出現幸福哥所說的輕鬆實現嵌套的那種內容.
來來來,我們撇開那些複雜的&那些容易混淆視聽的,用最簡單粗暴的方式來看看C++
11可以讓我們懶到什麼程度!C++ 11 新特性之一 Initializer list
這個新特性咋一看摸不著頭腦的,是不是你也跟我一樣,一看就聯想到類的構造函數列表呢? 不急不急,我們一個個看~
好,要說這個新特性,首先要從C++ 03的vector說起... 什麼什麼?離題了?我靠!你先看完再罵行不?
發現沒有,功能都很簡單都很陽春,可是,要打很多字而且都是重複的,有木有?! 那好! 我們看看如果用C++ 11來寫會怎樣…
少打一堆字有木有… 並且,所有相關的STL容器都已更新可接收初始化列表的了.不用添加新的頭文件,也不用修改配置,名符其實的無需冷藏亦不含防腐劑…
除了這些,還可以自定義自己的初始化列表構造函數,這個就要加頭文件了.做法如下:
自己跟著敲一下代碼,跑幾遍,或者這改一下,那加一點,看看有什麼不一樣.
C++ 11 新特性之二 Uniform Initialization
中文我猜叫一致性初始化.同樣先來看看C++ 03的玩法
沒毛病,來看看C++ 11
C++ 11 新特性之三 auto type
同樣,先看C++ 03 :
再來C++ 11的:
auto這個東東很依賴集成開發環境,因此,IDE就變得越來越重要了,因為你要指望滑鼠挪到變數上好讓它告訴這個變數是什麼類型~
這裡插一個C++ 14的跟auto有關的新特性.
好!該說的注釋都寫了,我們Next.
C++ 11 新特性之四 foreach
其實,上面已經看到了,我們這裡再簡化一下,同樣先來C++ 03
再看看後生可畏的C++ 11:
上一個特性里已經講到,例如要在foreach裡面修改變數的值要怎麼做,這裡就不重複了.
C++ 11 新特性之五 nullptr
老規矩,先來C++ 03
再來看C++ 11:
C++ 11 新特性之六 enum class
enum class在C++ 11中又叫強類型枚舉.同樣,先看看傳統的enum怎麼玩,有請C++ 03:
然後,看看enum class:
C++ 11 新特性之七 static_assert
看代碼吧,鬼扯扯不動了,老了…
那麼傳統的運行時庫斷言都是運行的時候才會發生斷言,而C++ 11這個特性,則是在編譯的時候編譯器就給你斷言了.可以說是C++ 11 就更安全了~
C++ 11 新特性之八 Delegating Constructor
C++ 11 新特性之九 override (for virtual function)
這裡的override實際上是個關鍵字.
C++ 11 新特性之十 final (for virtual funciton and for class)
這個C++ 03就沒法比較了,所以,這裡就分成for virtual function和for class的C++ 11代碼.自己看吧
由此可見final在這就給古代的公公證明了其職位之存在是有其歷史價值的.
C++ 11 新特性之十一 Compiler Generated Default Constructor
強制編譯器在用戶已提供構造函數的時候再生產預設的構造函數.這個就沒有C++ 03的對照了,原因你懂…
可以認為說dogA是傳統C++的寫法.而dogB只是傳統的基礎上加了新特性.
C++ 11 新特性之十二 delete 關鍵字
這個delete不是new了對象以後刪除對象的delete,它是用於刪除類的方法的,有點想像不了對吧?來~看例子:
我們知道C++在構造類對象的時候會加了許多的東西,記得我曾經也在群里說過,C語言程序在內存的布局和C++的程序的內存模型是不一樣的,原因就在這裡,因為編譯器悄無聲息的給你加好多東西,不然,你以為C++用起來那麼方便那是怎麼來的呢?所以C++ 11就給一個delete的關鍵字,讓那些不需要的功能可以有機會給你去幹掉,又或者純粹想給類瘦身諸如此類.這裡把C++ 03跟 C++ 11的代碼混在一起, 一對比就明白這特性是什麼意思了有木有?!
C++ 11 新特性之十三 constexpr 關鍵字
這個例子又是要C++ 03和C++ 11寫到一起,才能理解這個關鍵字的作用,用說的用寫的都很難表達明白.所以,看代碼吧
C++ 11 新特性之十四 New String
這個特性如果要細講那範圍就大了,因為這新的字元串類型都有其底層的類型,底層的類型又隨系統變化.這裡僅僅以Win10為例.其他的就不詳細講,以後需要用到再度娘或者放狗(google)搜一下好了.
再看一次:
C++ 11 新特性之十五 lambda function
lambde function基本上就個匿名函數.你可以認為它就是一個非典型的普通函數.同樣,這玩意也沒有C++ 03的版本,原因你也懂… 而在C++ 11裡面搭載auto類型一起使用爽到內傷,而Qt用來搭配信號與槽更加是爽到體無完膚搖搖欲墜的.
如果理解這個lambda有困難,那我們來比照著來看,那就清晰了.
這裡先講講lambda的語法,我大概的畫了個圖.
這一圖就抵萬語千言了. 來看實例吧.
結束
好,基本上來到這裡,如果你全程都有自己敲一下代碼的話,恭喜你,C++ 11你就在不知不覺中學完了,或者說入門了~ 至於那些什麼左值右值什麼的,基本你自己可以摸索著學習了.那不礙事,還有就是在模板上的應用那也差不多的,基本的語言原則都類似的,只是有些細節要遵守,這裡為了降低複雜度沒有對那些進行說明. 那C++ 14其實也沒新增多少東西,有了這個C++ 11的老底,再去學C++ 14的新玩意,相信也不會有什麼門檻了.所以,這篇東東就到這裡結束.
推薦閱讀:
※不要錯過效果廣告的下一個流量紅利
※Airbnb今日宣布重大轉型,要和攜程、窮游競爭了
※好煩今天又看到科幻迷拿人工智慧說事
※科技巨頭紛紛角逐奧運會,參賽的正確姿勢是什麼?