C++第11版本中的一些強(qiáng)大的新特性小結(jié)
Auto Type Deduction 自動(dòng)類型推導(dǎo)
auto 關(guān)鍵字讓用戶得以使用 C++ 內(nèi)置的類型推導(dǎo)特性。
std::string something = somethingthatreturnsastring.getString(); auto something = somethingthatreturnsastring.getString();
Auto 關(guān)鍵字會(huì)對(duì)上述自變量(something)進(jìn)行自動(dòng)推導(dǎo),得出其應(yīng)該是 string 類型的結(jié)論,并在 auto 出現(xiàn)的地方用正確的類型進(jìn)行替換。這個(gè)特性對(duì)迭代器特別有用。
for(std::vector<T>::iterator it = x.begin(); it != x.end(); i++) { it->something(); }
上述代碼可以寫成:
for(auto it = x.begin(); it != x.end(); i++) { it->something(); }
贊! 代碼看上去簡(jiǎn)潔多了!
Strongly Typed Enums 強(qiáng)類型枚舉
這個(gè)特性可以有效避免枚舉類型的命名沖突,從而消除很多潛在的 bug。在舊版本的 C++ 中,程序員必須為每一個(gè)枚舉項(xiàng)設(shè)定一個(gè)全局唯一的名字。例如,如果你給一個(gè)枚舉項(xiàng)取名叫 None,那么其他的枚舉集合就不能再用這個(gè)名字了。但是現(xiàn)在,你可以這么做了?。ㄗg注:作者下面給的例子仿佛和上面的文字不是非常搭配//myEnum ::All 和 myEnum::All是不是存在差異?)
enum class myEnum {None, One, All}; myEnum o = myEnum ::All; auto p = myEnum::All; // 同樣有效
Lambdas 表達(dá)式
Lambda 表達(dá)式簡(jiǎn)單說就是個(gè)匿名函數(shù)(譯注:原文為in-place function,意思是“用來鑲嵌的函數(shù)”,但是匿名函數(shù)能更精確表達(dá)這個(gè)含義)。對(duì)于迭代器以及for 循環(huán)非常有用,這種函數(shù)你只需要在程序的某一處使用一次,所以沒有必要專門在程序里明確定義它。Lambda 表達(dá)式并沒有讓 C++ 在邏輯表達(dá)上做到“及以往之不可及”的程度,它是一種受函數(shù)式編程思想影響而引入的語言特性,能夠讓程序更緊湊。Lambda 表達(dá)式的最簡(jiǎn)形式是下面這樣的:
[]() { }
加上所有可能的操作符,會(huì)是這樣:
[]() mutable -> T { }
其中[]是捕獲列表,()是參數(shù)列表,{}是函數(shù)體
Capture List 捕獲列表
捕獲列表定義了什么類型的東西可以從 Lambda 表達(dá)式之外匹配到函數(shù)體中來??梢园韵逻@些:
一個(gè)值:[x]
一個(gè)引用 [&x]
當(dāng)前范圍內(nèi)任意變量的引用 [&]
同3,但是通過變量的值
你可以對(duì)上面的各項(xiàng)進(jìn)行任意混合,只要用逗號(hào)隔開即可 [x, &y]
Argument List 參數(shù)列表
參數(shù)列表和 C++ 函數(shù)的參數(shù)列表是一個(gè)概念。
Function Body 函數(shù)體
函數(shù)體是指在 Lambda 表達(dá)式被調(diào)用時(shí)真正執(zhí)行的代碼。
Return Type Deduction
返回值推斷
如果 Lambda 表達(dá)式只有一個(gè)返回聲明,那么返回值類型就可以省略,其類型就是隱式類型:decltype(return_statement)
可變 Labmda
如果一個(gè) Lambda 表達(dá)式被標(biāo)記為 mutable(例如:[]() mutable{ }),那么對(duì)于按值捕獲的數(shù)值來說,在函數(shù)體內(nèi)就允許對(duì)這些值進(jìn)行修改操作。
下面舉個(gè)例子:
int main() { char s[]="Hello World!"; int Uppercase = 0; //lambda會(huì)改變這個(gè)變量的值 for_each(s, s+sizeof(s), [&Uppercase] (char c) { if (isupper(c)) Uppercase++; }); cout<< Uppercase<<" uppercase letters in: "<< s<<endl; }
Unique 指針
Unique 指針是 C++11 版本的智能指針類。
一旦你用 unique_ptr 關(guān)鍵字定義了一個(gè)對(duì)象,那么下列事件只要發(fā)生一個(gè),對(duì)象就會(huì)被銷毀并釋放內(nèi)存:
unique_ptr 管理的對(duì)象被銷毀。
unique_ptr 管理的對(duì)象通過賦值操作符指向另一個(gè)指針,或調(diào)用了reset()方法。
對(duì)于不想了解太多細(xì)節(jié)的用戶來說,這就意味著如果你使用了 unique 指針的語義,那么在跳出作用域之前,你就不用手動(dòng)回收對(duì)象的內(nèi)存了。
以前,我們需要這么寫代碼:
YourObject * obj = new YourObject();
然后在程序的最后你一定要記得釋放內(nèi)存:
delete(obj);
否則你可就造成內(nèi)存泄露了。而現(xiàn)在,
std::unique_ptr<YourObject> obj(new YourObject());
當(dāng) obj 跳出作用域范圍之外的時(shí)候,內(nèi)存將會(huì)被自動(dòng)回收。
static_assert
static_assert 簡(jiǎn)單說就是一個(gè)在編譯期執(zhí)行的斷言。例如,你可以這么做:
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
假設(shè)由于系統(tǒng)的原因造成了上述的邏輯判斷的失敗,那么 static_assert 就會(huì)斷言失敗。
它的另一種用途,是和 C++ 特征類型搭配使用。比如:
static_assert(std::is_pod<yourstruct>::value, "Not a pod struct!");
POD 是指“簡(jiǎn)單數(shù)據(jù)”(Plain Old Data)結(jié)構(gòu),也就是說,它是一個(gè)的類(你可以用struct關(guān)鍵字定義,也可以用class關(guān)鍵字定義),但沒有構(gòu)造函數(shù),析構(gòu)函數(shù)和虛成員函數(shù)。所以,如果一個(gè)愚蠢的菜鳥程序員企圖給這種類型增加構(gòu)造函數(shù)的話,static_assert 就會(huì)在編譯的時(shí)候阻止這種行為,并報(bào)錯(cuò)。這對(duì)代碼維護(hù)來說可是非常有用的。
欄 目:C語言
下一篇:C++實(shí)現(xiàn)自頂向下的歸并排序算法
本文標(biāo)題:C++第11版本中的一些強(qiáng)大的新特性小結(jié)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2603.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入第K大數(shù)問題以及算法概要的詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文