kernel panic 總結了 c++11 中的 5 個實用特性:自動型別推導、強型別列舉、unique 指標、static_assert、lambdas 表示式。
auto 關鍵字讓使用者得以使用 c++ 內建的型別推導特性。
1
2
std::string something = somethingthatreturnsastring.getstring();
auto something = somethingthatreturnsastring.getstring();
auto 關鍵字會對上述自變數(something)進行自動推導,得出其應該是 string 型別的結論,並在 auto 出現的地方用正確的型別進行替換。這個特性對迭代器特別有用。
1
2
3
4
for
(std::vector::iterator it = x.begin(); it != x.end(); i++)
上述**可以寫成:
1
2
3
4
for
(auto it = x.begin(); it != x.end(); i++)
贊! **看上去簡潔多了!
這個特性可以有效避免列舉型別的命名衝突,從而消除很多潛在的 bug。在舊版本的 c++ 中,程式設計師必須為每乙個列舉項設定乙個全域性唯一的名字。例如,如果你給乙個列舉項取名叫 none,那麼其他的列舉集合就不能再用這個名字了。但是現在,你可以這麼做了!(譯註:作者下面給的例子彷彿和上面的文字不是非常搭配//myenum ::all 和 myenum::all是不是存在差異?)
12
3
enum
class
myenum ;
myenum o = myenum ::all;
auto p = myenum::all;
// 同樣有效
lambda 表示式簡單說就是個匿名函式(譯註:原文為in-place function,意思是「用來鑲嵌的函式」,但是匿名函式能更精確表達這個含義)。對於迭代器以及for 迴圈非常有用,這種函式你只需要在程式的某一處使用一次,所以沒有必要專門在程式裡明確定義它。lambda 表示式並沒有讓 c++ 在邏輯表達上做到「及以往之不可及」的程度,它是一種受函式式程式設計思想影響而引入的語言特性,能夠讓程式更緊湊。lambda 表示式的最簡形式是下面這樣的:
() 加上所有可能的操作符,會是這樣:
1
()
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),那麼對於按值捕獲的數值來說,在函式體內就允許對這些值進行修改操作。
下面舉個例子:
1
2
3
4
5
6
7
8
9
10
int
main()
);
cout<< uppercase<<
" uppercase letters in: "
<< s<}
unique 指標是 c++11 版本的智慧型指標類。
一旦你用 unique_ptr 關鍵字定義了乙個物件,那麼下列事件只要發生乙個,物件就會被銷毀並釋放記憶體:
以前,我們需要這麼寫**:
1
yourobject * obj =
new
yourobject();
然後在程式的最後你一定要記得釋放記憶體:
1
delete
(obj);
否則你可就造成記憶體洩露了。而現在,
1
std::unique_ptrobj(
new
yourobject());
當 obj 跳出作用域範圍之外的時候,記憶體將會被自動**。
static_assert 簡單說就是乙個在編譯期執行的斷言。例如,你可以這麼做:
1
static_assert(
sizeof
(unsigned
int
) * char_bit == 32);
假設由於系統的原因造成了上述的邏輯判斷的失敗,那麼 static_assert 就會斷言失敗。
它的另一種用途,是和 c++ 特徵型別搭配使用。比如:
1
static_assert(std::is_pod::value,
"not a pod struct!"
);
pod 是指「簡單資料」(plain old data)結構,也就是說,它是乙個的類(你可以用struct關鍵字定義,也可以用class關鍵字定義),但沒有建構函式,析構函式和虛成員函式。所以,如果乙個愚蠢的菜鳥程式設計師企圖給這種型別增加建構函式的話,static_assert 就會在編譯的時候阻止這種行為,並報錯。這對**維護來說可是非常有用的。
C 11 實用特性總結
c 11新引入的auto是乙個十分好用的特性,它的用途主要是自動型別推斷和返回值佔位。自動型別推斷 auto可以從表示式中推斷出 返回值型別 這裡一定要有乙個具體的表示式,然後根據表示式計算出結果,將結果返回給auto型別的變數。int main auto的自動型別推斷有兩個顯著優點,其一是可以省去...
C 11 實用新特性總結
template classt1,class t2 auto add t1x,t2 y decltype x y 只使用一次的函式物件,能否不要專門為其編寫乙個類?只呼叫一次的簡單函式,能否在呼叫時才寫出其函式體?形式 外部變數訪問方式說明符 參數列 返回值型別語句組 外部變數訪問方式說明符形式 可...
c 11常用特性
目錄 一 atomic 1 std atomic flag 2 std atomic 二 std thread 三 std condition variable 四 右值引用 五 std function std bind 六 lambda表示式 atomic flag 一種簡單的原子布林型別,只支...