C++第11版本中的一些壯大的新特征小結。本站提示廣大學習愛好者:(C++第11版本中的一些壯大的新特征小結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++第11版本中的一些壯大的新特征小結正文
Auto Type Deduction 主動類型推導
auto 症結字讓用戶得以應用 C++ 內置的類型推導特征。
std::string something = somethingthatreturnsastring.getString(); auto something = somethingthatreturnsastring.getString();
Auto 症結字會對上述自變量(something)停止主動推導,得出其應當是 string 類型的結論,並在 auto 湧現的處所用准確的類型停止調換。這個特征對迭代器特殊有效。
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(); }
贊! 代碼看上去簡練多了!
Strongly Typed Enums 強類型列舉
這個特征可以有用防止列舉類型的定名抵觸,從而清除許多潛伏的 bug。在舊版本的 C++ 中,法式員必需為每個列舉項設定一個全局獨一的名字。例如,假如你給一個列舉項取名叫 None,那末其他的列舉聚集就不克不及再用這個名字了。然則如今,你可以這麼做了!(譯注:作者上面給的例子似乎和下面的文字不長短常搭配//myEnum ::All 和 myEnum::All是否是存在差別?)
enum class myEnum {None, One, All}; myEnum o = myEnum ::All; auto p = myEnum::All; // 異樣有用
Lambdas 表達式
Lambda 表達式簡略說就是個匿名函數(譯注:原文為in-place function,意思是“用來鑲嵌的函數”,然則匿名函數能更准確表達這個寄義)。關於迭代器和for 輪回異常有效,這類函數你只須要在法式的某一處應用一次,所以沒有需要專門在法式裡明白界說它。Lambda 表達式並沒有讓 C++ 在邏輯表達上做到“及以往之弗成及”的水平,它是一種受函數式編程思惟影響而引入的說話特征,可以或許讓法式更緊湊。Lambda 表達式的最簡情勢是上面如許的:
[]() { }
加上一切能夠的操作符,會是如許:
[]() mutable -> T { }
個中[]是捕捉列表,()是參數列表,{}是函數體
Capture List 捕捉列表
捕捉列表界說了甚麼類型的器械可以從 Lambda 表達式以外婚配到函數體中來。可以包括以下這些:
一個值:[x]
一個援用 [&x]
以後規模內隨意率性變量的援用 [&]
同3,然則經由過程變量的值
你可以對下面的各項停止隨意率性混雜,只需用逗號離隔便可 [x, &y]
Argument List 參數列表
參數列表和 C++ 函數的參數列表是一個概念。
Function Body 函數體
函數體是指在 Lambda 表達式被挪用時真正履行的代碼。
Return Type Deduction
前往值揣摸
假如 Lambda 表達式只要一個前往聲明,那末前往值類型便可以省略,其類型就是隱式類型:decltype(return_statement)
可變 Labmda
假如一個 Lambda 表達式被標志為 mutable(例如:[]() mutable{ }),那末關於按值捕捉的數值來講,在函數體內就許可對這些值停止修正操作。
上面舉個例子:
int main() { char s[]="Hello World!"; int Uppercase = 0; //lambda會轉變這個變量的值 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 症結字界說了一個對象,那末以下事宜只需產生一個,對象就會被燒毀並釋放內存:
unique_ptr 治理的對象被燒毀。
unique_ptr 治理的對象經由過程賦值操作符指向另外一個指針,或挪用了reset()辦法。
關於不想懂得太多細節的用戶來講,這就意味著假如你應用了 unique 指針的語義,那末在跳出感化域之前,你就不消手動收受接管對象的內存了。
之前,我們須要這麼寫代碼:
YourObject * obj = new YourObject();
然後在法式的最初你必定要記得釋放內存:
delete(obj);
不然你可就形成內存洩漏了。而如今,
std::unique_ptr<YourObject> obj(new YourObject());
當 obj 跳出感化域規模以外的時刻,內存將會被主動收受接管。
static_assert
static_assert 簡略說就是一個在編譯期履行的斷言。例如,你可以這麼做:
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
假定因為體系的緣由形成了上述的邏輯斷定的掉敗,那末 static_assert 就會斷言掉敗。
它的另外一種用處,是和 C++ 特點類型搭配應用。好比:
static_assert(std::is_pod<yourstruct>::value, "Not a pod struct!");
POD 是指“簡略數據”(Plain Old Data)構造,也就是說,它是一個的類(你可以用struct症結字界說,也能夠用class症結字界說),但沒有結構函數,析構函數和虛成員函數。所以,假如一個愚昧的菜鳥法式員妄圖給這類類型增長結構函數的話,static_assert 就會在編譯的時刻阻攔這類行動,並報錯。這對代碼保護來講可長短常有效的。