C++11新特性的总结
C++11新特性
統(tǒng)一的初始化
C++98中標(biāo)準(zhǔn)允許使用花括號(hào){}對(duì)數(shù)組元素進(jìn)行統(tǒng)一的列表初始值設(shè)定
int array1[] = {1,2,3,4,5}; int array2[5] = {0};對(duì)于vector容器來(lái)說(shuō)不能這樣初始化
vector<int> v{1,2,3,4,5};就無(wú)法通過(guò)編譯,導(dǎo)致每次定義vector時(shí),都需要先把vector定義出來(lái),然后使用循環(huán)對(duì)其賦初始值,非常不方便。
C++11擴(kuò)大了用大括號(hào)括起的列表(初始化列表)的使用范圍,使其可用于所有的內(nèi)置類型和用戶自定義的類型,使用初始化列表時(shí),可添加等號(hào)(=),也可不添加。
內(nèi)置類型花括號(hào){}初始化
// 內(nèi)置類型變量int x1 = { 10 };int x2{ 10 };int x3 = 1 + 2;int x4 = { 1 + 2 };int x5{ 1 + 2 };int x6{ x1 + x2 };// 數(shù)組int arr1[5] {1, 2, 3, 4, 5};int arr2[]{1, 2, 3, 4, 5};// 動(dòng)態(tài)數(shù)組,在C++98中不支持int* arr3 = new int[5]{1, 2, 3, 4, 5};// 標(biāo)準(zhǔn)容器vector<int> v{ 1, 2, 3, 4, 5 };map<int, int> m{ { 1, 1 }, { 2, 2, }, { 3, 3 }, { 4, 4 } };單個(gè)自定義類型列表初始化
class Point { public:Point(int x = 0, int y = 0) : _x(x), _y(y){} private:int _x;int _y; }; int main() {//兩種初始化都可以Point p{ 1, 2 };Point p2(1, 2);return 0; }多個(gè)自定義類型列表初始化
多個(gè)對(duì)象想要支持列表初始化,需給該類(模板類)添加一個(gè)帶有initializer_list類型參數(shù)的構(gòu)造函數(shù)即可。注意:initializer_list是系統(tǒng)自定義的類模板,該類模板中主要有三個(gè)方法:begin()、end()迭代器以及獲取區(qū)間中元素個(gè)數(shù)的方法size()。
template<class T>class vector{public:vector():_start(nullptr), _finish(nullptr), _endofstorage(nullptr){}vector(initializer_list<T>l):_start(new T[l.size()]){_finish = _start;for (auto e : l){*_finish++ = e;}}private:T* _start;T* _finish;T* _endofstorage;};變量類型推導(dǎo)
auto推導(dǎo)
auto總結(jié)
decltype類型推導(dǎo)
auto使用的前提是:必須要對(duì)auto聲明的類型進(jìn)行初始化,否則編譯器無(wú)法推導(dǎo)出auto的實(shí)際類型
template<class T1,class T2> //返回的時(shí)候,返回T1和T2都不行,應(yīng)該返回T1+T2后的值的類型 auto Add(const T1& left, const T2& right) {return left + right; }如果能用加完之后結(jié)果的實(shí)際類型作為函數(shù)的返回值類型就不會(huì)出錯(cuò),但這需要程序運(yùn)行完才能知道結(jié)果的
實(shí)際類型,即RTTI(Run-Time Type Identification 運(yùn)行時(shí)類型識(shí)別)。
- typeid只能查看類型不能用其結(jié)果類定義類型
- dynamic_cast只能應(yīng)用于含有虛函數(shù)的繼承體系中
所以需要新的關(guān)鍵字
decltype是根據(jù)表達(dá)式的實(shí)際類型推演出定義變量時(shí)所用的類型,例如:返回值類型推演
//此處auto為占位符 //返回值類型追蹤 auto Add( T1& left, T2& right)->decltype(left+right) {return left + right;//ret = left + right; }int main() {int a = 1;double b = 2.0;cout<< Add(a, b);return 0; }范圍for循環(huán)
范圍for
final和override
多態(tài)中總結(jié)過(guò)
智能指針
智能指針總結(jié)
新增容器----靜態(tài)數(shù)組array,forward_list以及unordered系列
委派構(gòu)造函數(shù)
所謂委派構(gòu)造函數(shù):就是指委派函數(shù)將構(gòu)造的任務(wù)委派給目標(biāo)構(gòu)造函數(shù)來(lái)完成的一種類構(gòu)造的方式。
在初始化列表中調(diào)用”基準(zhǔn)版本”的構(gòu)造函數(shù)稱為委派構(gòu)造函數(shù),而被調(diào)用的”基準(zhǔn)版本”則稱為目標(biāo)構(gòu)造函數(shù)。
注意:構(gòu)造函數(shù)不能同時(shí)”委派”和使用初始化列表。
- 委派構(gòu)造函數(shù)同時(shí)可以是目標(biāo)構(gòu)造函數(shù)
- 切記:環(huán)狀委派 依然可以通過(guò)編譯但是會(huì)右棧溢出
右值引用
右值引用的總結(jié)
默認(rèn)函數(shù)控制
C++11讓程序員可以控制是否需要編譯器生成那些默認(rèn)生成的函數(shù)
顯式缺省函數(shù)
在C++11中,可以在默認(rèn)函數(shù)定義或者聲明時(shí)加上=default,從而顯式的指示編譯器生成該函數(shù)的默認(rèn)版本,用=default修飾的函數(shù)稱為顯式缺省函數(shù)。
class A { public:A(int a): _a(a){}// 顯式缺省構(gòu)造函數(shù),由編譯器生成A() = default;// 在類中聲明,在類外定義時(shí)讓編譯器生成默認(rèn)賦值運(yùn)算符重載A& operator=(const A& a); private:int _a; };A& A::operator=(const A& a) = default; int main() {A a1(10);A a2;a2 = a1;return 0; }刪除默認(rèn)函數(shù)
如果能想要限制某些默認(rèn)函數(shù)的生成,在C++98中,是該函數(shù)設(shè)置成private,并且不給定義,這樣只要其他人想要調(diào)用就會(huì)報(bào)錯(cuò)。在C++11中更簡(jiǎn)單,只需在該函數(shù)聲明加上=delete即可,該語(yǔ)法指示編譯器不生成對(duì)應(yīng)函數(shù)的默認(rèn)版本,稱=delete修飾的函數(shù)為刪除函數(shù)。
class A { public:A(int a): _a(a){}// 禁止編譯器生成默認(rèn)的拷貝構(gòu)造函數(shù)以及賦值運(yùn)算符重載A(const A&) = delete;A& operator(const A&) = delete; private:int _a; }; int main() {A a1(10);// 編譯失敗,因?yàn)樵擃悰](méi)有拷貝構(gòu)造函數(shù)//A a2(a1);// 編譯失敗,因?yàn)樵擃悰](méi)有賦值運(yùn)算符重載A a3(20);a3 = a2;return 0; }注意:避免刪除函數(shù)和explicit一起使用
缺省參數(shù)
lambda表達(dá)式和線程庫(kù)
lambda表達(dá)式和線程庫(kù)的總結(jié)
總結(jié)
以上是生活随笔為你收集整理的C++11新特性的总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 原神埃洛伊命之座怎么获得
- 下一篇: C++中的lambda表达式和线程库