国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器

這篇具有很好參考價(jià)值的文章主要介紹了【C++11】{}初始化、std::initializer_list、decltype、STL新增容器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. C++11簡(jiǎn)介

在2003年C++標(biāo)準(zhǔn)委員會(huì)曾經(jīng)提交了一份技術(shù)勘誤表(簡(jiǎn)稱TC1),使得C++03這個(gè)名字取代了C++98稱為C++11之前的最新C++標(biāo)準(zhǔn)名稱。
不過(guò)由于C++03(TC1)主要是對(duì)C++98標(biāo)準(zhǔn)中的漏洞進(jìn)行修復(fù),語(yǔ)言的核心部分則沒有改動(dòng),因此人們習(xí)慣性的把兩個(gè)標(biāo)準(zhǔn)合并稱為C++98/03標(biāo)準(zhǔn)。

從C++0x到C++11,C++標(biāo)準(zhǔn)10年磨一劍,第二個(gè)真正意義上的標(biāo)準(zhǔn)珊珊來(lái)遲

相比于C++98/03,C++11則帶來(lái)了數(shù)量可觀的變化,其中包含了約140個(gè)新特性,以及對(duì)C++03標(biāo)準(zhǔn)中約600個(gè)缺陷的修正,這使得C++11更像是從C++98/03中孕育出的一種新語(yǔ)言。
相比較而言,C++11能更好地用于系統(tǒng)開發(fā)和庫(kù)開發(fā)、語(yǔ)法更加泛化和簡(jiǎn)單化、更加穩(wěn)定和安全,不僅功能更強(qiáng)大,而且能提升程序員的開發(fā)效率,公司實(shí)際項(xiàng)目開發(fā)中也用得比較多,所以我們要作為一個(gè)重點(diǎn)去學(xué)習(xí)。
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11

C++11增加的語(yǔ)法特性非常篇幅非常多,我們這里沒辦法一 一講解,所以最近的幾篇文章主要講解實(shí)際中比較實(shí)用的語(yǔ)法

官方文檔

小故事:

1998年是C++標(biāo)準(zhǔn)委員會(huì)成立的第一年,本來(lái)計(jì)劃以后每5年視實(shí)際需要更新一次標(biāo)準(zhǔn),C++國(guó)際標(biāo)準(zhǔn)委員會(huì)在研究C++ 03的下一個(gè)版本的時(shí)候,一開始計(jì)劃是2007年發(fā)布,所以最初這個(gè)標(biāo)準(zhǔn)叫C++ 07。但是到06年的時(shí)候,官方覺得2007年肯定完不成C++ 07,而且官方覺得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07還是08還是09年完成。
結(jié)果2010年的時(shí)候也沒完成,最后在2011年終于完成了C++標(biāo)準(zhǔn)。所以最終定名為C++11。

2. 統(tǒng)一的列表初始化

首先聲明一下:

這個(gè)列表初始化和我們類和對(duì)象那里學(xué)的初始化列表不是一個(gè)概念,是不同的。

2.1 {}初始化

在C++98中,標(biāo)準(zhǔn)允許使用花括號(hào){}對(duì)數(shù)組或者結(jié)構(gòu)體元素進(jìn)行統(tǒng)一的列表初始值設(shè)定。
比如:

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11

那我們C語(yǔ)言里面其實(shí)就是這樣搞的嘛,所以可以認(rèn)為C++支持這樣就是因?yàn)橐嫒軨嘛

那么在C++11中:

C++11擴(kuò)大了用大括號(hào)括起的列表的使用范圍,使其可用于所有的內(nèi)置類型和用戶自定義的類型,使用初始化列表時(shí),可添加等號(hào)(=),也可不添加。

??,我們來(lái)演示一下:

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
大家看,C++11支持我們這樣使用{}初始化,并且賦值=也可以省略

然后要注意:

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
這樣寫是咋回事?
??,這是不是可以認(rèn)為是調(diào)int的默認(rèn)構(gòu)造啊,我們之前說(shuō)過(guò),有了模板之后,內(nèi)置類型也需要有構(gòu)造函數(shù)了。

然后:

C++11中列表初始化也可以適用于new表達(dá)式中
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11

另外:

創(chuàng)建對(duì)象時(shí)也可以使用列表初始化方式調(diào)用構(gòu)造函數(shù)初始化

比如我們之前寫過(guò)的日期類:

class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date(int year, int month, int day)" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11

2.2 std::initializer_list

那除了上面的場(chǎng)景呢,C++11還支持了STL里面的容器也可以這樣去初始化

比如:

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
??,都是可以的,其它容器也可以,大家可以自己試。

那大家思考一下,在容器這里它是如何支持可以這樣寫的呢?

首先我們來(lái)看一下這個(gè):

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
這里我們直接給一個(gè)大括號(hào),里面放一些元素,這是個(gè)啥啊。
之前我們初始化數(shù)組可以這樣寫嘛,那它在這里也是一個(gè)數(shù)組嗎?
那數(shù)組怎么直接賦值給一個(gè)vector呢?
??,那不清楚的話我們可以打印看一下它的類型是什么:
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
大家看,它的類型是一個(gè)叫做initializer_list<int>的東西。

那為什么這個(gè)東西可以賦值給vector呢?

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
??,大家看紅色圈出來(lái)的部分,C++11給STL中的這些容器增加了這樣一個(gè)構(gòu)造函數(shù)。
支持用initializer_list類型的對(duì)象去構(gòu)造vector這些容器。
所以正常使用這個(gè)構(gòu)造應(yīng)該是這樣寫:
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
那我們寫成這樣
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
當(dāng)然也可以,因?yàn)闃?gòu)造函數(shù)支持隱式類型轉(zhuǎn)換嘛。

那initializer_list這個(gè)類是個(gè)啥呢?

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
initializer_list是C++11引入的一種特殊類型,用于簡(jiǎn)化初始化列表的使用。它可以在構(gòu)造函數(shù)或函數(shù)參數(shù)中以列表的形式傳遞一組值。
可以認(rèn)為它就是一個(gè)常量數(shù)組,存儲(chǔ)在常量區(qū),initializer_list對(duì)象中的元素永遠(yuǎn)是常量值,我們無(wú)法改變initializer_list對(duì)象中元素的值。
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
這是它的一些接口

那我們接下來(lái)做一件事情:

我們之前不是模擬實(shí)現(xiàn)過(guò)STL里面的各種容器的,那以vector為例,我們來(lái)對(duì)它改造一下,讓它也支持用initializer_list進(jìn)行{}初始化和賦值。

怎么做呢?給它增加這個(gè)構(gòu)造函數(shù)就行了

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
??,每增加之前我們自己的vector肯定是不行的,而且大家看這個(gè)報(bào)錯(cuò),編譯器自動(dòng)就把后面的常量數(shù)組識(shí)別成initializer list類型了
我們來(lái)寫一下:
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
這下我們?cè)賮?lái)運(yùn)行
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
就可以了
然后再提一下就是
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
如果這里用迭代器遍歷的話前面加一個(gè)typename,這個(gè)我們之前也提過(guò),就是類模板里面直接取內(nèi)嵌類型它會(huì)分不清是類型還是靜態(tài)成員變量。

當(dāng)然不止vector可以,我們說(shuō)了C++11給STL這幾個(gè)容器都增加了initializer_list版本的構(gòu)造:

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11

當(dāng)然除了構(gòu)造還支持了initializer_list版本的賦值重載:

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11

3. 聲明

c++11提供了多種簡(jiǎn)化聲明的方式

3.1 auto

那auto呢我們?cè)贑++專欄第一篇文章C++入門的時(shí)候就介紹過(guò)了,所以這里就不再重復(fù)了

3.2 decltype

再來(lái)學(xué)一個(gè)C++11引入的關(guān)鍵字——decltype

什么作用呢?

decltype是可以獲取表達(dá)式或變量類型的關(guān)鍵字
我們之前用過(guò)typeid(變量/表達(dá)式).name()可以獲取變量或表達(dá)式的類型,然后我們可以打印出來(lái)查看,而使用decltype我們可以獲取類型并使用這個(gè)類型

比如:

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11

但是大家可能會(huì)說(shuō):

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
上面的場(chǎng)景用auto也是可以的啊。

確實(shí),但是有的場(chǎng)景auto就不行,比如:

我們要定義一個(gè)vector,要求vector里面存儲(chǔ)的數(shù)據(jù)類型跟表達(dá)式x*y的返回類型一致
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
大家看,這個(gè)場(chǎng)景auto就不行了吧

4. nullptr

這個(gè)我們之前也介紹過(guò)了

5. 范圍for循環(huán)

也介紹過(guò)了

6. 智能指針

關(guān)于智能指針我們后面會(huì)單獨(dú)作為一個(gè)章節(jié)來(lái)給大家講解

7. C++11STL中的一些變化

下面我們來(lái)分析一下C++11中STL與之前相比有了那些變化

首先它增加了一些新容器:

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
用橘色圈起來(lái)是C++11中的一些幾個(gè)新容器,我們也都介紹過(guò)了,但是實(shí)際最有用的是unordered_map和unordered_set,另外兩個(gè)就顯得非常雞肋
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11

其次呢就是增加了一些新方法:

比如提供了cbegin和cend方法返回const迭代器等等,但是實(shí)際意義不大,因?yàn)閎egin和end也是可以返回const迭代器的,這些都是屬于錦上添花的操作。
實(shí)際上C++11更新后,容器中增加的新方法最實(shí)用的就是插入接口函數(shù)的右值引用版本
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11

那關(guān)于這里3、4兩點(diǎn)提到的右值引用和移動(dòng)語(yǔ)義我們后面也會(huì)花大量篇幅給大家講解…

8. 演示代碼

把上面演示過(guò)的代碼給大家:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//struct Point
//{
//	int _x;
//	int _y;
//};
//
//int main()
//{
//	int a(4);
//
//	int b = { 2 };
//	int c{ 3 };
//
//	int arr[]{ 1,2,3,4,5 };
//
//	Point p{ 1,2 };
//
//	// C++11中列表初始化也可以適用于new表達(dá)式中
//	int* pa = new int{ 5 };
//	cout << *pa << endl;
//	return 0;
//}

//class Date
//{
//public:
//	Date(int year, int month, int day)
//		:_year(year)
//		, _month(month)
//		, _day(day)
//	{
//		cout << "Date(int year, int month, int day)" << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	Date d1(2022, 1, 1); // old style
//
//	// C++11支持的列表初始化,這里會(huì)調(diào)用構(gòu)造函數(shù)初始化
//	Date d2 = { 2022, 1, 2 };
//	Date d3{ 2022, 1, 3 };
//	return 0;
//}

#include <vector>
#include <list>
//int main()
//{
//	vector<int> v = { 1,2,3,4 };
//
//	vector<int> v2({ 1,2,3,4 });
//
//	list<int> lt = { 2,4,6,8,9 };
//
//	initializer_list<int> il = { 1,2,3,4,5,6,7,8 };
//
//	vector<int> v3 = il;
//
//	return 0;
//}

int main()
{
	const int x = 1;
	double y = 2.2;
	//decltype(x * y) ret; // ret的類型是double
	//decltype(&x) p;		// p的類型是const int*

	auto ret = x * y;
	auto p = &x;

	vector<decltype(x* y)> v;

	cout << typeid(ret).name() << endl;
	cout << typeid(p).name() << endl;

	return 0;
}

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器,C++入門到起飛,c++,list,C++11文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-731706.html

到了這里,關(guān)于【C++11】{}初始化、std::initializer_list、decltype、STL新增容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • PLSQL啟動(dòng)報(bào)錯(cuò):Initialization error,不能初始化

    PLSQL啟動(dòng)報(bào)錯(cuò):Initialization error,不能初始化

    出現(xiàn)場(chǎng)景:我這里原來(lái)有個(gè)舊版的PLSQL,想用新版的又裝了個(gè)新版,啟動(dòng)的時(shí)候報(bào)錯(cuò) 第一個(gè)提示明顯看到是和程序位數(shù)相關(guān)的,不管是32位還是64位要做到向匹配 第二個(gè)提示可以看到是和oci.dll文件的設(shè)置相關(guān) 登錄的時(shí)候先點(diǎn)取消,不使用用戶登錄,進(jìn)入客戶端 檢查PLSQL的OC

    2024年01月23日
    瀏覽(38)
  • 【MySQL安裝問(wèn)題】mysqld --initialize初始化報(bào)錯(cuò)

    【MySQL安裝問(wèn)題】mysqld --initialize初始化報(bào)錯(cuò)

    在顯示安裝成功MySQL后,初始化mysqld --initialize報(bào)錯(cuò),錯(cuò)誤顯示如下 2023-04-03T709:05:28.842980Z O[Warning] TMESTAMP with implicit DEFAULT walue is deprecated.Please use -explicit_lefatlts_for_timestamp server option (see documentation for more details). 2023-04-03T09:05:28.8430327O [Warning] \\\'NO_ZERO_DATE\\\', ‘NO_ZBRO _TN DATE\\\' and \\\'ER

    2024年02月11日
    瀏覽(27)
  • ORB-SLAM2算法12之單目初始化Initializer

    ORB-SLAM2算法7詳細(xì)了解了 System 主類和多線程、

    2024年02月10日
    瀏覽(20)
  • 從C語(yǔ)言到C++_33(C++11_上)initializer_list+右值引用+完美轉(zhuǎn)發(fā)+移動(dòng)構(gòu)造/賦值

    從C語(yǔ)言到C++_33(C++11_上)initializer_list+右值引用+完美轉(zhuǎn)發(fā)+移動(dòng)構(gòu)造/賦值

    目錄 1.?列表初始化initializer_list 2. 前面提到的一些知識(shí)點(diǎn) 2.1 小語(yǔ)法 2.2 STL中的一些變化 3. 右值和右值引用 3.1?右值和右值引用概念 3.2?右值引用類型的左值屬性 3.3?左值引用與右值引用比較 3.4?右值引用的使用場(chǎng)景 3.4.1 左值引用的功能和短板 3.4.2?移動(dòng)構(gòu)造 3.4.3?移動(dòng)賦值

    2024年02月12日
    瀏覽(36)
  • 【重磅】:Spring Initializer 已經(jīng)不支持Java8,也就是SpringBoot2.x項(xiàng)目初始化

    【重磅】:Spring Initializer 已經(jīng)不支持Java8,也就是SpringBoot2.x項(xiàng)目初始化

    我們可以看到在IDEA內(nèi)置的Spring Initializer中 Java版本選擇模塊已經(jīng)不支持1.8了,同樣的,官網(wǎng)也不再支持了 Spring Boot 3.x要求 Java最低版本為17, 最新的SpringBoot版本已經(jīng)要求Java21了 所以,你可以升級(jí)Java版本,使用SpringBoot3.X 我們可以嘗試查看一下, 訪問(wèn)Spring官網(wǎng),按照下圖操作

    2024年02月04日
    瀏覽(26)
  • k8s初始化報(bào)錯(cuò)[kubelet-check] Initial timeout of 40s passed.

    k8s初始化報(bào)錯(cuò)[kubelet-check] Initial timeout of 40s passed.

    使用kubeadm進(jìn)行k8s部署,在初始化的時(shí)候,遇到如下 一直卡在了[kubelet-check] Initial timeout of 40s passed.,查看kubelet日志 就出現(xiàn)這個(gè)錯(cuò)誤,我?guī)讉€(gè)node的IP地址檢查過(guò)好多遍也沒問(wèn)題 上網(wǎng)找了很多方法都解決不了 查了下資料k8s 已經(jīng)棄用了docker了,如果安裝的kubelet kubeadm kubectl 是V

    2024年02月17日
    瀏覽(21)
  • PLSQL連接遠(yuǎn)端Oracle服務(wù)器提示:“Initialization error ***不能初始化 oci.dl ***”的解決方案

    PLSQL連接遠(yuǎn)端Oracle服務(wù)器提示:“Initialization error ***不能初始化 oci.dl ***”的解決方案

    【PLSQL連接遠(yuǎn)端Oracle服務(wù)器提示:“Initialization error ***不能初始化 oci.dl ***”的解決方案】 繼上篇如題報(bào)錯(cuò)提示如何解決事項(xiàng): 1、其一、確認(rèn)Oracle服務(wù)端、客戶端、PLSQL Developer都必須位數(shù)一致,32bit/64bit,如出現(xiàn)位數(shù)不一致則無(wú)法加載。Oracle Instant Client 下載官網(wǎng) 2、其二、配

    2024年02月15日
    瀏覽(28)
  • Android 11屬性系統(tǒng)初始化流程

    Android 11屬性系統(tǒng)初始化流程

    在init進(jìn)程啟動(dòng)的第二階段,調(diào)用PropertyInit 對(duì)屬性系統(tǒng)進(jìn)行初始化 PropertyInit函數(shù)在systemcoreinitproperty_service.cpp 中實(shí)現(xiàn) 注釋1處在dev下創(chuàng)建__properties__文件夾。注釋2處會(huì)收集讀取各個(gè)分區(qū)下的property_contexts文件,將讀取到的信息系列化之后,寫到/dev/ properties /property_info文件中。

    2024年04月09日
    瀏覽(20)
  • 【C++11】:統(tǒng)一的列表初始化|聲明|STL變化

    【C++11】:統(tǒng)一的列表初始化|聲明|STL變化

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??慕斯主頁(yè) : 修仙—?jiǎng)e有洞天 ?? ????????????????????????????????????????? ??? 今日夜電波:マイノリティ脈絡(luò)—ずっと真夜中でいいのに。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    2024年03月26日
    瀏覽(35)
  • Android 11 Ethernet以太網(wǎng)架構(gòu)分析(1)——初始化

    android中以太網(wǎng)常被用作共享網(wǎng)絡(luò),或者是定制化設(shè)備連接網(wǎng)線的需求。 本章將會(huì)詳細(xì)分析該模塊對(duì)以太網(wǎng)的邏輯實(shí)現(xiàn),是大家對(duì)此有更深入認(rèn)識(shí)。 初始化 Systemserver 在安卓系統(tǒng)中有一個(gè)關(guān)于以太網(wǎng)的服務(wù),在systemserver中啟動(dòng) frameworks/base/services/java/com/android/server/SystemServer.j

    2024年02月04日
    瀏覽(83)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包