C 11 的 5 個實用特性

2021-07-08 16:44:05 字數 3558 閱讀 6612

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

enumclassmyenum ;

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

intmain()

);

cout<< uppercase<<" uppercase letters in: "<< s<}

unique 指標是 c++11 版本的智慧型指標類。

一旦你用 unique_ptr 關鍵字定義了乙個物件,那麼下列事件只要發生乙個,物件就會被銷毀並釋放記憶體:

以前,我們需要這麼寫**:

1

yourobject * obj =newyourobject();

然後在程式的最後你一定要記得釋放記憶體:

1

delete(obj);

否則你可就造成記憶體洩露了。而現在,

1

std::unique_ptrobj(newyourobject());

當 obj 跳出作用域範圍之外的時候,記憶體將會被自動**。

static_assert 簡單說就是乙個在編譯期執行的斷言。例如,你可以這麼做:

1

static_assert(sizeof(unsignedint) * 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 一種簡單的原子布林型別,只支...