百科不全書之 C 11新特性

2021-10-10 15:37:24 字數 2403 閱讀 3260

1.統一的初始化方法 int arr[3],int *p=new int[20] ;

2.成員變數預設初始值 class b

6.基於範圍的for迴圈:int ary for(int & e:ary )

7.在c+11中,對於defaulted函式,編譯器會為其自動生成預設的函式定義體,從而獲得更高的**執行效率,也可免除程式設計師手動定義該函式的工作量

8.右值引用和move 語義:原來學的都是左值引用,&&右值引用,減少深拷貝的物件次數。

9.strcpy 不判斷s是不是null,所以我們也不做這個。

10.雜湊表(無序檔案):在unordered_map中插入時間複雜度低,浪費記憶體。

11.引用正規表示式:標頭檔案:regex

12.lambda表示式:(){}

c++11中提供了std::bind。bind()函式的意義就像它的函式名一樣,是用來繫結函式呼叫的某些引數的。

bind的思想實際上是一種延遲計算的思想,將可呼叫物件儲存起來,然後在需要的時候再呼叫。而且這種繫結是非常靈活的,不論是普通函式、函式物件、還是成員函式都可以繫結,而且其引數可以支援佔位符,比如你可以這樣繫結乙個二元函式auto f = bind(&func, _1, _2);,呼叫的時候通過f(1,2)實現呼叫。

int testfunc

(int a, char c, float f

)//std::placeholders是乙個佔位符。當使用bind生成乙個新的可呼叫物件時,std::placeholders表示新的可呼叫物件的第 幾個引數和原函式的第幾個引數進行匹配,

auto bindfunc1 =

bind

(testfunc, std:

:placeholders:

:_1,

'a',

100.1);

bindfunc1(10

);//引數的第乙個位置為佔位符std::placeholders::_2,這就表示,呼叫bindfunc3的時候,它的第二個引數和testfunc的第乙個引數匹配

auto bindfunc3 =

bind

(testfunc,std:

:placeholders:

:_2,std:

:placeholders:

:_3,std:

:placeholders:

:_1)

;bindfunc3

(100.1,30

,'c'

);

定義的變數可以自動判斷變數的型別。但是要初始化 auto i=100 尤其在定義容器時:函式的返回值也可以是auto 4.decltype:求表示式的型別 decltype(a) x1

標頭檔案 使用方式:shared_ptr ptr1 shared_ptr ptr2(new a(2)) shared_ptr ptr1§ reset(為空表示釋放,加入指標則表示託管) 空指標 nullptr 可以轉換為bool型,但是不能變整型。

名詞含義

std::auto_ptr

有很多問題。 不支援複製(拷貝建構函式)和賦值(operator =),但複製或賦值的時候不會提示出錯。因為不能被複製,所以不能被放入容器中。同時auto_ptr不能呼叫delete,不能指向陣列。在c++11中已經不建議使用

unique_ptr

也不支援複製和賦值,但比auto_ptr好,直接賦值會編譯出錯。實在想賦值的話,需要使用:std::move。一般而言,這個智慧型指標實現了獨佔式擁有概念,意味著它可確保乙個物件和其相應資源同一時間只被乙個指標擁有。一旦擁有者被銷毀或變成空,或開始擁有另乙個物件,先前擁有的那個物件就會被銷毀,其任何相應資源也會被釋放。

shared_ptr

基於引用計數的智慧型指標。可隨意賦值,直到記憶體的引用計數為0的時候這個記憶體會被釋放

weak_ptr

弱引用。 引用計數有乙個問題就是互相引用形成環,這樣兩個指標指向的記憶體都無法釋放。需要手動打破迴圈引用或使用weak_ptr。顧名思義,weak_ptr是乙個弱引用,只引用,不計數。如果一塊記憶體被shared_ptr和weak_ptr同時引用,當所有shared_ptr析構了之後,不管還有沒有weak_ptr引用該記憶體,記憶體也會被釋放。所以weak_ptr不保證它指向的記憶體一定是有效的,在使用之前需要檢查weak_ptr是否為空指標。

shared_ptrunique_ptr的主要區別在於前者是使用引用計數的智慧型指標。引用計數的智慧型指標可以跟蹤引用同乙個真實指標物件的智慧型指標例項的數目。這意味著,可以有多個std::shared_ptr例項可以指向同一塊動態分配的記憶體,當最後乙個引用物件離開其作用域時,才會釋放這塊記憶體。shared_ptr的引用計數本身是安全且無鎖的,但物件的讀寫則不是,因為 shared_ptr 有兩個資料成員,讀寫操作不能原子化

C 11新特性之 nullptr

我們知道在程式設計的世界裡,0有雙重的角色,可以表示整數零,也可以表示乙個空指標。在c語言中,通過預編譯巨集null,可以區分0表示的是零還是 void 0.但是,在c 的世界中,這樣是不可以的。c 中允許函式過載。例如 void foo char void foo int 如果把null定義為0,...

c 11新特性之auto

在早期版本中,auto關鍵字用來宣告具有自動儲存器的區域性變數,auto關鍵字很少被使用,除了靜態變數之外,其它的變數預設是auto的。因此,在c 11中,刪除了原有的功能,並對其重新設計,增加了auto的型別推導功能。template double add t1 a,t2 b int main i...

C 11 新特性之 lambda

這是c 11新特性介紹的第三部分,涉及到c 11這次更新中較為重要的lambda表示式。不想看toy code的讀者可以直接拉到文章最後看這部分的總結。熟悉python的程式設計師應該對lambda不陌生。簡單來說,lambda就是乙個匿名的可呼叫 塊。在c 11新標準中,lambda具有如下格式 ...