c++11擴大了初始化列表的使用範圍,所有的內建型別和使用者自定義型別都可以使用列表初始化,=號可新增可不新增。
如:
容器支援花括號列表初始化,本質上是增加了乙個接收花括號引數int
main()
;int arr2;
int*arr3 =
newint[5
];vector<
int> v1
; vector<
int> v2 =
;return0;
}
initializer_list
的建構函式。
使用auto推導實際變數的實際型別,可以使**更加簡潔,直觀。需要注意使用auto之前,必須對auto宣告的型別進行初始化,否則編譯器就無法推導出auto的實際型別。
如:
執行時型別識別:rtti(run-time type identification),程式允許完之後才知道結果的實際型別。int
main()
,}; unordered_map
int>
::iterator it = umap.
begin()
;auto ti = umap.
begin()
;return0;
}
c++98中支援rtti:
typeid只能檢視型別,不能用其結果定義型別;
dynamic_cast只能應用於函式虛函式的繼承體系中。
c++11中,使用decltype,根據表示式的實際型別推演出定義變數時所用的型別
推演表示式型別作為變數的定義型別:
2. 推演函式返回值的型別:
這裡只會推演返回值型別,不會執行函式。容器支援範圍for迴圈,是因為編譯器將範圍替換成了迭代器,也就是迭代器支援範圍for迴圈。
final:修飾類時,表明該類不能被繼承,修飾虛成員函式時,表明該虛成員函式在繼承體系中,不能被重寫。int
main()
;for
(const
auto
& e : vv)
//範圍for迴圈遍歷時,若沒有對元素的更改,則建議加上const,且加上引用,為了避免一直呼叫拷貝建構函式
cout << endl;
return0;
}
override:在多型體系中,派生類需要重寫虛函式,加上override會檢查是否完成了重寫。
顯式預設函式:在預設函式定義或者宣告時加上= default
,從而顯式的讓編譯器生成該函式的預設版本,用= default
修飾的函式稱為顯式預設函式。
刪除預設函式:若要限制某些預設函式的生成,c++98中,將函式設定為private,並且不給出定義,這樣呼叫就會報錯。c++11中,在函式宣告加上= delete
,該語法讓編譯器不生產對應函式的預設版本,稱= delete
修飾的函式為刪除函式。
lambda表示式書寫格式:[capature-list] (parameters) mutable-> return-type;
引數解釋:最簡單的lambda函式為:{}。省略引數列表、返回值型別capature-list:捕捉列表,編譯器根據來判斷接下裡的**是否為lambda函式,捕捉列表能夠捕捉上下文中變數提供給lambda函式使用
值傳遞方式捕捉變數:[var]
值傳遞方式捕捉父作用域中所有變數:[=]
引用傳遞捕捉變數:[&var]
引用傳遞方式捕捉父作用域中所有變數:[&]
值傳遞方式捕捉當前this指標:[this]
注意:捕捉列表不允許有變數重複傳遞,否則就會導致編譯錯誤。傳值捕捉的物件不能被改變,若想修改加上mutable,但是修改的只是lambda表示式中的值,不會修改父作用域中物件的值。
parameters:引數列表,與普通函式的引數列表一致,若不傳遞引數,可取消()
mutable:預設情況下,lambda函式是乙個const函式,mutable可修改常性,使用該修飾符時,引數列表不能省略(即使為空)
->returntype:返回值型別,追蹤返回型別形式宣告函式的返回值型別,沒有返回值時可省略,返回值型別明確時,也可省略,由編譯器自動推導。
statement:函式體,可以使用引數列表中的引數,也可使用捕捉列表中的引數。
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中,的使用範圍變得更廣,可...