![[C++11] { }列表初始化](http://pic.xiahunao.cn/yaotu/[C++11] { }列表初始化)
?嘿各位技術(shù)潮人好久不見甚是想念。生活就像一場奇妙冒險而編程就是那把超酷的萬能鑰匙。此刻陽光灑在鍵盤上靈感在指尖跳躍讓我們拋開一切束縛給平淡日子加點料注入滿滿的passion。準(zhǔn)備好和我一起沖進(jìn)代碼的奇幻宇宙了嗎Let’s go我的博客yuanManGan我的專欄C入門小館 C言雅韻集 數(shù)據(jù)結(jié)構(gòu)漫游記 閑言碎語小記坊 進(jìn)階數(shù)據(jù)結(jié)構(gòu) 走進(jìn)Linux的世界 題山采玉 領(lǐng)略算法真諦C 111.C11的發(fā)展歷史C11是C發(fā)行的第二個主要版本并且對比C98,有了重要的更新C03之后過了整整八年才C11才真正問世。從此C版本每隔3年推出一次版本。2. 列表初始化2.1 C98傳統(tǒng)的{}在c98中{}主要用于初始化數(shù)組和簡單的結(jié)構(gòu)體。structPoint{int_x;int_y;};intmain(){// 數(shù)組初始化inta1[]{1,2,3,4,5};inta2[5]{0};// 結(jié)構(gòu)體初始化Point p{1,2};return0;}基本類型不能用{}初始化需要使用賦值或者構(gòu)造函數(shù)。intx19;// 賦值初始化classDate{public:Date(intyear1,intmonth1,intday1):_year(year),_month(month),_day(day){}private:int_year;int_month;int_day;};intmain(){Dated(2025,1,1);// 使用構(gòu)造函數(shù)初始化return0;}2.2 C11中的{}c11引入了列表初始化使得幾乎所有類型的對象都可以使用{}初始化{}初始化也叫列表初始化。內(nèi)置類型支持自定義類型也支持自定義類型的列表初始化等于先創(chuàng)建臨時對象然后進(jìn)行拷貝構(gòu)造編譯器優(yōu)化為直接構(gòu)造。{}初始化中可以省略。#includeiostream#includevectorusingnamespacestd;structPoint{int_x;int_y;};classDate{public:Date(intyear1,intmonth1,intday1):_year(year),_month(month),_day(day){coutDate(int year, int month, int day)endl;}Date(constDated):_year(d._year),_month(d._month),_day(d._day){coutDate(const Date d)endl;}private:int_year;int_month;int_day;};intmain(){//C11支持的//1.內(nèi)置類型inta{5};//2.自定義類型Date d1{2025,9,3};//這里的本質(zhì)是先創(chuàng)造臨時對象然后d1拷貝構(gòu)造構(gòu)造臨時對象//但編譯器進(jìn)行優(yōu)化后就直接會用(2025, 9, 3)進(jìn)行構(gòu)造constDated2{2025,9,3};//這里d2引用的是{2025, 9, 3}創(chuàng)建的臨時對象// 需要注意的是C98?持單參數(shù)時類型轉(zhuǎn)換也可以不?{}Date d3{2025};Date d42025;// 可以省略掉Point p1{1,2};intx2{2};Date d6{2024,7,25};constDated7{2024,7,25};//只有{}初始化才能省略// Date d8 2025;vectorDatev;v.push_back(d1);v.push_back(Date(2025,1,1));// ?起有名對象和匿名對象傳參這?{}更有性價?v.push_back({2025,1,1});return0;}2.3 C11中的std::initializer_list雖然上面的初始化已經(jīng)很方便了但在容器初始化時如果我們用多個值進(jìn)行初始化時就要寫很多構(gòu)造函數(shù)很麻煩。vectorintv1{1,2,3};vectorintv2{1,2,3,4,5};C11庫中提出了?個std::initializer_list的類這個類底層是開一個數(shù)組將數(shù)據(jù)拷貝過來然后有兩個指針分別指向開頭和結(jié)尾。這是他的?檔initializer_liststd::initializer_list?持迭代器遍歷。容器?持?個std::initializer_list的構(gòu)造函數(shù)也就?持任意多個值構(gòu)成的 {x1,x2,x3…} 進(jìn)?初始化。STL中的容器?持任意多個值構(gòu)成的 {x1,x2,x3…} 進(jìn)?初始化就是通過std::initializer_list的構(gòu)造函數(shù)?持的。#includeiostream#includevector#includestring#includemapusingnamespacestd;intmain(){std::initializer_listintmylist;mylist{10,20,30};coutsizeof(mylist)endl;// 這?begin和end返回的值initializer_list對象中存的兩個指針// 這兩個指針的值跟i的地址跟接近說明數(shù)組存在棧上inti0;coutmylist.begin()endl;coutmylist.end()endl;coutiendl;// {}列表中可以有任意多個值//// 這兩個寫法語義上還是有差別的第?個v1是直接構(gòu)造// 第?個v2是構(gòu)造臨時對象臨時對象拷?v2優(yōu)化為直接構(gòu)造// v3: 引用綁定。{...}構(gòu)造出一個臨時vector純右值v3直接綁定到該臨時對象。vectorintv1({1,2,3,4,5});vectorintv2{1,2,3,4,5};constvectorintv3{1,2,3,4,5};// 這?是pair對象的{}初始化和map的initializer_list構(gòu)造結(jié)合到?起?了mapstring,stringdict{{sort,排序},{string,字符串}};// initializer_list版本的賦值?持v1{10,20,30,40,50};return0;}