C 11新特性知識點整理

2021-10-03 22:35:54 字數 2776 閱讀 6831

關鍵字及語法:

auto 關鍵字:編譯器可以根據初始值自動推導出型別。我們不必費心去推導複雜表示式的型別。

但是需要注意幾點:

使用auto關鍵字的變數必須進行初始化。

auto關鍵字不能用於函式傳參以及陣列型別的推導。(陣列型別會推導為指標)

可能存在二義性,例如,auto s=「abc」,s是乙個const char*而不是string 型別。

**跨平台性降低,因為別的編譯器不一定支援。

nullptr關鍵字:nullptr是一種特殊型別的字面值,它可以被轉換成任意其他型別的指標型別;而null一般巨集定義為0,在遇到過載時可能會出現問題。

stl容器:

unordered_map,unordered_set

智慧型指標

c++11新增了shared_ptr和weak_ptr等型別的智慧型指標,用於解決記憶體管理的問題。

初始化列表:使用初始化列表可以對類進行初始化

右值引用:基於右值引用可以實現移動操作,消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率。

noexcept: 指定某個函式不會丟擲異常,緊跟在函式的引數列表後面

lambda表示式:

lambda表示式定義乙個匿名函式,並且可以捕獲一定範圍內的變數,其定義如下:

[capture list](params list)->return type

[capture list] 是乙個lambda所在函式中定義的區域性變數的列表,可以捕獲所在函式的區域性變數可以直接用,還可以直接用區域性static變數以及全域性變數.

可以進行值捕獲

引用捕獲

隱式捕獲

(params list) 引數列表,與普通函式的引數列表一致,如果不需要,可以省略

mutable 修飾符,預設情況下lambda函式總是乙個const函式,mutable可以取消其常量性.在使用該修飾符時,引數列表不可省略

函式體,內容與普通函式一樣,除了可以使用引數之外,還可以使用所捕獲的變數.

作用:常用於stl庫中,在某些場景下可用於簡化仿函式的使用,提高複雜**的開發速度,輕鬆在函式內重用**,無需費心設計介面.

為了支援移動操作和完美**,新標準引入了一種新的引用型別-右值引用。所謂右值引用就是必須繫結到右值的引用,通過&&而不是&來獲得右值引用。它有乙個重要的性質,只能繫結到乙個將要銷毀的物件,所以可以自由地將乙個右值引用的資源移動到另乙個物件中。

實現移動操作需要為其定義移動建構函式和移動賦值運算子。

移動建構函式的第乙個引數是該型別的乙個右值引用。因為右值引用總是繫結到乙個將要銷毀的值,並且確保銷毀它是無害的,這樣就可以完成移動,資源的所有權已經歸屬新建立的物件。

移動建構函式一般要求移動操作過程不丟擲異常。

還有就是移後源物件必須可析構。

類預設使用拷貝建構函式,如果乙個類定義了拷貝建構函式和拷貝賦值運算子,編譯器不會為其預設生成移動建構函式和移動賦值運算子。

比如說,如果vector使用移動操建構函式,那麼在移動過程中,如果只移動了一部分而不是全部,發生異常,但是原空間的元素不存在了,這時候就無法繼續。

某些函式需要將其乙個或多個實參連同型別不變地**給其他函式。

我們可以使函式引數是指向模板型別引數的右值引用,它對應的實參的const屬性和左值或右值保持。

1.簡單記憶就是:左值可以位於賦值語句的左側,右值則不能。

2.當乙個物件被用作右值的時候用的是物件的值;用作左值的時候,用的是物件的身份。(也就是在記憶體中的位置)

3.左值具有持久狀態,右值暫存,要麼是字面常量,要麼是表示式求值過程中建立的匿名物件。

4.需要用到右值的地方可以用左值代替,實際用的是它的值,但是不能把右值當做左值。

5.左值能對表示式取位址,右值不能對表示式取位址

1.變數是左值,因此我們不能將乙個右值引用繫結到乙個變數上,而左值引用可以。

2.右值引用只能繫結到臨時物件,該物件具備兩個性質,所引用的物件將要銷毀且該物件沒有其他使用者。

左值引用則不能繫結到要求轉換的表示式,字面常量,或是返回右值的表示式。

3.還有乙個重要的特徵是:右值引用不能繫結到乙個右值引用型別的變數上。

例:int &&rr1=42 將右值引用繫結到乙個字面值,此rr1現在是乙個右值引用變數,所以不能再多乙個右值引用繫結到這個rr1

int &&rr3=std::move(rr1) rr1在上面

當我們呼叫move函式是告訴編譯器:我們現在有乙個左值,我們希望像乙個右值一樣處理它。之後我們對這個物件除了複製或銷毀它,我們將不再使用它

如果沒有移動建構函式,只有拷貝建構函式。那麼此時使用move處理乙個右值引用怎麼處理?答案是將這個右值引用當成乙個const左值引用進行拷貝處理。

需要析構函式的類也需要拷貝建構函式和拷貝賦值函式。

需要拷貝操作的類也需要賦值操作,反之亦然。

析構函式不能是刪除的

如果乙個類有刪除的或不可訪問的析構函式,那麼其預設和拷貝建構函式會被定義為刪除的。

如果乙個類有const或引用成員,則不能使用合成的拷貝賦值操作。鍵字的作用

c 知識點整理

1.c 中類是否支援多繼承?請說明原因。答 不支援,需要用介面來實現多繼承 2.我們都知道乙個類可以有多個建構函式,並且c 會在我們建立類的時候預設的提供乙個無參的建構函式,當我實現了另外乙個有引數的建構函式的時候,我還能呼叫無引數的建構函式嗎?請說明原因。答 不能,因為一旦你實現了乙個建構函式,c...

C 知識點整理

函式的呼叫約定 字首自增和字尾自增的區別 字首自增就是i 字尾自增就是 i。乙個變數使用字首或字尾方式增1的結果是一樣的。但,如果涉及到增1後的賦值,字首增1會把增1後的值賦值給其它變數,而字尾增1會把增1前的值賦值給其它變數。char型別自增方式 取值範圍是 128 127,當超過127時會溢位,...

併發一致性知識點整理

1 併發如何產生?併發一定是兩個不同的會話的sql產生的。table 資料 從資料庫返回結果 1 結果集 select 2 行數 update delete insert 3 error 發出的sql命令一定滿足資料完整性規則 行列完整性,觸發器完整性 同乙個事務的若干sql命令滿足業務邏輯一致性,...