C++11已不是新鮮技術,但對于我來說,工作中用得還不夠多(前東家長時間使用gcc3.4.5,雖然去年升了4.8.2,但舊模塊維護還是3.4.5居多;新東家用的是4.4.6,不能完整支持C++11,而且有內部有基礎庫早已支持了C++11 STL的部分功能),再加上自己的練習也寫得少,了解僅是幾點簡單的皮毛,這里對C++11學習總結一番,期望對他人以及未來的我有點技術知識索引上的幫助。
首先,wiki是最全面的:https://en.wikipedia.org/wiki/C%2B%2B11,這是C++完整的新功能,個人使用的編譯器可能不完整支持,可以看這個編譯器+版本對C++1X的支持情況:http://en.cppreference.com/w/cpp/compiler_support 。
然后,看英文不夠快,找一篇看起來比較全的中文總結(不全,還是要看wiki):http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html 。
一、新特性簡介
C++11之前被稱為C++0x,因為原本計劃在2010年發(fā)布,所以之前一些編譯器使用C++11的編譯參數是:-std=c++0x,后面使用:-std=c++11。C++11 設計的核心是:少改動語言,多改動基礎庫。
改動涉及到這幾點:支持多線程編程(增加了thread庫)、加強泛型編程(增量了hash容器、任意多個元素的tuple、bind函數、lambda函數)、統(tǒng)一初始化(以花括號調用構造函數)、性能(右值引用和move),其它stl庫(正則表達式、原子操作庫),另外還有一些語法糖的支持,如:default、delete定義(可以在派生類中delete掉基類的public函數),裸字符串的定義、類非靜態(tài)成員變量直接賦值、nullptr、支持連續(xù)兩個右尖括號、后置返回類型、Range-based的for循環(huán)、構造函數可以調用另一個構造函數、override關鍵字用于發(fā)現虛函數的覆蓋錯誤、string literal.......。
二、部分常用新特性\庫
挑選幾個常用的記錄如下
1、統(tǒng)一初始化
之前,我想初始化一個放著map對象的容器,需要這樣子:
std::vector<std::map<std::string, std::string> > a; std::map<std::string, std::string> tmp; tmp.insert(std::make_pair("1", "2")); a.push_back(tmp);
現在,我可以直接用大括號:
std::vector<std::map<std::string, std::string>> a