C 11中的一些新特性

2021-10-20 00:15:23 字數 2912 閱讀 5485

c++11擴大了初始化列表的使用範圍,所有的內建型別和使用者自定義型別都可以使用列表初始化,=號可新增可不新增。

如:

int

main()

;int arr2;

int*arr3 =

newint[5

];vector<

int> v1

; vector<

int> v2 =

;return0;

}

容器支援花括號列表初始化,本質上是增加了乙個接收花括號引數initializer_list的建構函式。

使用auto推導實際變數的實際型別,可以使**更加簡潔,直觀。需要注意使用auto之前,必須對auto宣告的型別進行初始化,否則編譯器就無法推導出auto的實際型別。

如:

int

main()

,}; unordered_map

int>

::iterator it = umap.

begin()

;auto ti = umap.

begin()

;return0;

}

執行時型別識別:rtti(run-time type identification),程式允許完之後才知道結果的實際型別。

c++98中支援rtti

typeid只能檢視型別,不能用其結果定義型別;

dynamic_cast只能應用於函式虛函式的繼承體系中。

c++11中,使用decltype,根據表示式的實際型別推演出定義變數時所用的型別

推演表示式型別作為變數的定義型別:

2. 推演函式返回值的型別:

這裡只會推演返回值型別,不會執行函式。容器支援範圍for迴圈,是因為編譯器將範圍替換成了迭代器,也就是迭代器支援範圍for迴圈。

int

main()

;for

(const

auto

& e : vv)

//範圍for迴圈遍歷時,若沒有對元素的更改,則建議加上const,且加上引用,為了避免一直呼叫拷貝建構函式

cout << endl;

return0;

}

final:修飾類時,表明該類不能被繼承,修飾虛成員函式時,表明該虛成員函式在繼承體系中,不能被重寫。

override:在多型體系中,派生類需要重寫虛函式,加上override會檢查是否完成了重寫。

顯式預設函式:在預設函式定義或者宣告時加上= default,從而顯式的讓編譯器生成該函式的預設版本,用= default修飾的函式稱為顯式預設函式。

刪除預設函式:若要限制某些預設函式的生成,c++98中,將函式設定為private,並且不給出定義,這樣呼叫就會報錯。c++11中,在函式宣告加上= delete,該語法讓編譯器不生產對應函式的預設版本,稱= delete修飾的函式為刪除函式。

lambda表示式書寫格式:[capature-list] (parameters) mutable-> return-type;

引數解釋:

capature-list:捕捉列表,編譯器根據來判斷接下裡的**是否為lambda函式,捕捉列表能夠捕捉上下文中變數提供給lambda函式使用

值傳遞方式捕捉變數:[var]

值傳遞方式捕捉父作用域中所有變數:[=]

引用傳遞捕捉變數:[&var]

引用傳遞方式捕捉父作用域中所有變數:[&]

值傳遞方式捕捉當前this指標:[this]

注意:捕捉列表不允許有變數重複傳遞,否則就會導致編譯錯誤。傳值捕捉的物件不能被改變,若想修改加上mutable,但是修改的只是lambda表示式中的值,不會修改父作用域中物件的值。

parameters:引數列表,與普通函式的引數列表一致,若不傳遞引數,可取消()

mutable:預設情況下,lambda函式是乙個const函式,mutable可修改常性,使用該修飾符時,引數列表不能省略(即使為空)

->returntype:返回值型別,追蹤返回型別形式宣告函式的返回值型別,沒有返回值時可省略,返回值型別明確時,也可省略,由編譯器自動推導。

statement:函式體,可以使用引數列表中的引數,也可使用捕捉列表中的引數。

最簡單的lambda函式為:{}。省略引數列表、返回值型別

lambda表示式之間不能相互進行賦值。

lambda表示式原理:還是依靠仿函式來實現,定義乙個lambda表示式,實際上編譯器會生成乙個lamber_uuid類,仿函式的operator()的引數和實現,就是替換編譯器生成的lamber_uuid仿函式的物件。

C 11新特性(一)

侯捷 c 11新特性 variadic templates uniform initialization initializer lists alias template 用例void print template typename t,typename.types void print const...

c 11的新特性

1 型別說明符auto 2.decltype提取型別 int a 0 decltype a b b 10 cout b endl 3.基於範圍的for迴圈 4.虛函式的override和final指示符 final修飾類 類無法被繼承 final修飾虛函式 虛函式不能被重寫 override就是輔助...

C 11的新特性

c 11提供在類中定義類的資料成員,可以直接在成員之後新增 預設值 當通過編譯器自動生成的預設建構函式初始化物件時,對應的資料成員就會被初始化成對應的預設值。class test int main 在c 98中,陣列可以使用 來進行初始化,對自定義型別是不可以的。在c 11中,的使用範圍變得更廣,可...