C++11中的{}與std::initializer_list深度解析
1.C++11中的{}
1.1.C++98中傳統(tǒng)的{}
用于對一般數(shù)組和結(jié)構(gòu)體的初始化
struct A {
int _x;
int _y;
};
int main()
{
int arr1[] = { 1,2,3,4,5,6 };
int arr2[] = { 0 };
A a = { 3,4 };
return 0;
}1.2.C++11中的{}
- 從C++11開始,想要統(tǒng)一初始化方式,實(shí)現(xiàn)一切對象都可用{}進(jìn)行初始化,用{}初始化也叫列表初始化
- 內(nèi)置類型和自定義類型均支持用{}初始化,自定義類型本質(zhì)是隱式類型轉(zhuǎn)換,會(huì)產(chǎn)生臨時(shí)變量(優(yōu)化以后變成直接構(gòu)造)
- 用{}初始化,=可以省略
- C++11中列表初始化統(tǒng)一了初始化方,在用多參數(shù)構(gòu)造對象時(shí),用{}初始化(相比有名對象和匿名對象傳參)會(huì)方便很多
#include <iostream>
#include <vector>
using namespace std;
struct A {
int _x;
int _y;
};
class Student {
public:
Student(const string& name, const int id = 0, const int age = 0)
:_name(name)
,_id(id)
,_age(age){}
Student(const Student& s)
:_name(s._name)
,_id(s._id)
,_age(s._age){ }
private:
string _name;
int _id;
int _age;
};
int main()
{
// C++98中的{}
int arr1[] = { 1,2,3,4,5,6 };
int arr2[] = { 0 };
A a = { 3,4 };
//C++11中的{}
//內(nèi)置類型初始化
int a = { 1 };
//自定義類型初始化
Student stu1 = { "WangPeng", 20251117, 19 };
//這里stu2引用的是{ "YiYi", 20258888, 18 }臨時(shí)變量
const Student& stu2 = { "YiYi", 20258888, 18 };
//只有{}初始化,才可以省略=
double num{ 3.14159 };
Student s{ "ZhangWei", 20236666, 22 };
vector<Student> students;
students.push_back(stu1);
students.push_back(Student{ "WangPeng", 20251117, 19 });
//相比有名對象和匿名對象傳參,{}更加方便
students.push_back({ "WangPeng", 20251117, 19 });
return 0;
}2.std::initializer_list
- 通過{}初始化已經(jīng)很方便了,但是對象容器的初始化還是不太方便,假設(shè)想對一個(gè)vector對象進(jìn)行初始化,要用N個(gè)值構(gòu)造初始化,那么需要構(gòu)造多次才能實(shí)現(xiàn)(因?yàn)槿萜髦性財(cái)?shù)量不確定,所以每個(gè)元素都要執(zhí)行對應(yīng)的構(gòu)造函數(shù))
vector<int> = {1, 2, 3, 4};- C++11庫中,新增了一個(gè)std::initializer_list類,它的本質(zhì)是底層開一個(gè)數(shù)組,將數(shù)據(jù)拷貝到數(shù)組中,其中包含兩個(gè)指針分別指向開始(begin)和結(jié)束(end)
auto il = {98, 99, 100};- initializer_list支持迭代器遍歷
- STL中的容器支持std::initializer_list的構(gòu)造函數(shù)(即支持任意多個(gè)值構(gòu)成的{x1, x2, x3, …}進(jìn)行初始化)
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
std::initializer_list<int> mylist;
mylist = { 23,24,25,26,27 };
int i = 0;
//my_list中只存了兩個(gè)首尾指針(在64位環(huán)境下大小均為8個(gè)字節(jié))
cout << sizeof(mylist) << endl;//輸出16
//首尾指針地址與變量i地址接近 說明該數(shù)組存儲(chǔ)在棧上
cout << mylist.begin() << endl;
cout << mylist.end() << endl;
cout << &i << endl;
//直接構(gòu)造
vector<int> v1({ 1,2,3,4,5 });
//構(gòu)造臨時(shí)對象->臨時(shí)對象拷貝給v2->優(yōu)化為直接構(gòu)造
vector<int> v2 = { 6,7,8,9,10 };
const vector<int>& v3 = { 11,22,33,44,55 };
//pair類型的{}初始化 + map的initializer_list構(gòu)造
map<string, string> dict = { {"a","一個(gè)"},{"stack","棧"},{"queue","隊(duì)列"} };
//initializer_list賦值可以這樣寫
v1 = { 111,222,333,444,555 };
return 0;
}到此這篇關(guān)于C++11中的{}與std::initializer_list的文章就介紹到這了,更多相關(guān)c++ std::initializer_list內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ Protobuf解決數(shù)據(jù)傳輸瓶頸面試精講
這篇文章主要介紹了c++ Protobuf解決數(shù)據(jù)傳輸瓶頸利器面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
在Centos7中使用vscode和gdb調(diào)試PG插件的方法
這篇文章主要介紹了在Centos7中使用vscode和gdb調(diào)試PG插件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
Qt自定義實(shí)現(xiàn)一個(gè)等待提示Ui控件
等待樣式控件是我們在做UI時(shí)出場率還挺高的控件之一,所以這篇文章主要為大家介紹了Qt如何自定義一個(gè)好看的等待提示Ui控件,感興趣的可以了解下2024-01-01
C++?LeetCode1769移動(dòng)所有球到每個(gè)盒子最小操作數(shù)示例
這篇文章主要為大家介紹了C++?LeetCode1769移動(dòng)所有球到每個(gè)盒子所需最小操作數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Qt C++實(shí)現(xiàn)錄屏錄音功能的示例詳解
實(shí)現(xiàn)一個(gè)錄屏+錄音的功能且需要快速開發(fā),Qt無疑是一個(gè)非常好的選擇。他有豐富的類庫和接口可以很好的滿足開發(fā)需求。本文就來和大家聊聊具體的實(shí)現(xiàn)方法吧2023-03-03
C++面試八股文之STL標(biāo)準(zhǔn)模板庫使用詳解
這篇文章主要為大家介紹了C++面試八股文之STL標(biāo)準(zhǔn)模板庫使用詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
C++使用ffmpeg實(shí)現(xiàn)rtsp取流的代碼
這篇文章主要介紹了C++使用ffmpeg實(shí)現(xiàn)rtsp取流,文章介紹了ffmepg采用rtsp取流流程圖,CMakeLists.txt編寫方法,通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
C++ Primer Plus 第四章之C++ Primer Plus復(fù)合類型學(xué)習(xí)筆記
數(shù)組(array)是一種數(shù)據(jù)格式,能夠存儲(chǔ)多個(gè)同類型的值。每個(gè)值都存儲(chǔ)在一個(gè)獨(dú)立的數(shù)組元素中,計(jì)算機(jī)在內(nèi)存中依次存儲(chǔ)數(shù)組的各個(gè)元素,今天給大家重點(diǎn)介紹C++ Primer Plus復(fù)合類型的實(shí)例詳解,感興趣的朋友一起看看吧2021-07-07

