最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11中隱式類型轉(zhuǎn)換的實現(xiàn)示例

 更新時間:2024年06月23日 10:48:54   作者:有趣的中國人  
C++類型轉(zhuǎn)換分為:隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換,本文主要介紹了C++11中隱式類型轉(zhuǎn)換的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下

1. 關(guān)于C++11

1.1 C++11簡介

在2003年C++標(biāo)準(zhǔn)委員會曾經(jīng)提交了一份技術(shù)勘誤表(簡稱TC1), 使得 C++03 這個名字已經(jīng)取代了 C++98 成為 C++11 之前的最新C++標(biāo)準(zhǔn)名稱。

不過由于 C++03(TC1) 主要是對 C++98 標(biāo)準(zhǔn)中的漏洞進(jìn)行修復(fù),語言的核心部分則沒有改動,因此人們習(xí)慣性的把兩個標(biāo)準(zhǔn)合并稱為 C++98/03 標(biāo)準(zhǔn)。從 C++0x 到C++11,C++ 標(biāo)準(zhǔn)10年磨一劍,第二個真正意義上的標(biāo)準(zhǔn)珊珊來遲。

相比于 C++98/03,C++11 則帶來了數(shù)量可觀的變化,其中包含了約 140 個新特性,以及對 C++03 標(biāo)準(zhǔn)中約 600 個缺陷的修正,這使得 C++11 更像是從 C++98/03 中孕育出的一種新語言。相比較而言,C++11 能更好地用于系統(tǒng)開發(fā)和庫開發(fā)、語法更加泛華和簡單化、更加穩(wěn)定和安全,不僅功能更強(qiáng)大,而且能提升程序員的開發(fā)效率,公司實際項目開發(fā)中也用得比較多,所以我們要認(rèn)真去學(xué)習(xí)。

1.2 C++11官方介紹

??官網(wǎng)鏈接: C++11

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

2.1 C/C++98 數(shù)組 & 結(jié)構(gòu)體 初始化

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

struct Point
{
	int _x;
	int _y;
};

int main()
{
	// struct Point類型的初始化
	Point p = { 100, 99 };
	int arr1[10] = { 10, 20, 30 };
	return 0;
}

2.2 單/多參數(shù)類型的隱式類型轉(zhuǎn)換

對于自定義類型,如果是單參數(shù)類型的構(gòu)造函數(shù),會發(fā)生隱式類型轉(zhuǎn)換,例如:

class A
{
public:
	A(int x)
		: _x(x)
		, _y(x)
	{}

	void Print()
	{
		cout << _x << ":" << _y << endl;
	}

private:
	int _x;
	int _y;
};

int main()
{
	// 隱式類型轉(zhuǎn)換
	A aa1 = 1;
	A aa2 = { 2 };
	
	// 直接構(gòu)造
	A aa3(3);
	
	// 也可以省略等號
	A aa4{ 1 };
	return 0;
}

如果是多參數(shù)類型的構(gòu)造函數(shù),同樣會發(fā)生隱式類型轉(zhuǎn)換,例如:

class A
{
public:
	A(int x, int y)
		: _x(x)
		, _y(y)
	{}
	
private:
	int _x;
	int _y;
};

int main()
{
	// 隱式類型轉(zhuǎn)換
	A aa1 = { 1, 2 };
	
	// 也可以省略等號
	A aa2{ 3, 4 };

	// 可以省略等號
	A aa3(4, 5);

	return 0;
}

如果不想發(fā)生隱式類型的轉(zhuǎn)換,可以在構(gòu)造函數(shù)之前加上 explicit 關(guān)鍵字,例如:

class A
{
public:
	// 不允許發(fā)生隱式類型轉(zhuǎn)換
	explicit A(int x, int y)
		: _x(x)
		, _y(y)
	{}
	
	// 不允許發(fā)生隱式類型轉(zhuǎn)換
	explicit A(int x)
		: _x(x)
		, _y(x)
	{}

	void Print()
	{
		cout << _x << ":" << _y << endl;
	}

private:
	int _x;
	int _y;
};

int main()
{
	// 下面兩行會報錯
	A aa0 = 1;
	A aa3 = { 1 };
	A aa1 = { 1, 2 };
	
	// 以下可以正常使用
	A aa2{ 3, 4 };
	A aa4{ 0 };
	
	return 0;
}

關(guān)于單/多參數(shù)類型的構(gòu)造函數(shù)的解釋:

對于形如 A aa1 = { 1, 2 };的構(gòu)造,編譯器處理時會發(fā)生以下兩個步驟:

首先會利用 { } 中的值調(diào)用構(gòu)造函數(shù)生成一個臨時變量;

對 aa1 進(jìn)行拷貝構(gòu)造。

但是編譯器會優(yōu)化成直接構(gòu)造。

對于形如 A aa2{ 3, 4 };的構(gòu)造,就會直接調(diào)用構(gòu)造函數(shù),不會產(chǎn)生臨時變量。

如果產(chǎn)生了臨時變量,我們知道臨時變量具有常性,就有:

  • 如果用:A& aa1 = { 1, 2 };會報錯。
  • 得用:const A& aa1 = { 1, 2 };

3. STL 中的 Initializer_list 構(gòu)造函數(shù)

我們這里先以 vector 為例。

3.1 Initializer_list 

initializer_list 是 C++11 引入的一種標(biāo)準(zhǔn)庫類型,用于方便地初始化同一種類型的元素列表。initializer_list 允許通過大括號 { } 語法進(jìn)行初始化,例如:

std::initializer_list<int> my_list = {1, 2, 3, 4, 5};

這里 my_list 是一個包含了整數(shù)元素 {1, 2, 3, 4, 5} 的 initializer_list<int> 對象。

主要特點包括:

  • 不可變性: 一旦初始化完成,initializer_list 中的元素不可再被修改。
  • 輕量:initializer_list 本身只包含指向數(shù)據(jù)的指針和長度信息,因此非常輕量,適合在函數(shù)參數(shù)傳遞和對象構(gòu)造時使用。
  • 語法簡潔: 通過 { } 初始化列表的語法,能夠清晰地指定一組初始值,而不需要顯式地調(diào)用構(gòu)造函數(shù)。

底層實現(xiàn)邏輯:

namespace std 
{
    template<class T>
    class initializer_list 
    {
    public:
        using value_type      = T;
        using reference       = const T&;
        using const_reference = const T&;
        using size_type       = size_t;

        initializer_list() noexcept; // 構(gòu)造一個空的 initializer_list
        size_type size() const noexcept; // 返回列表中元素的個數(shù)
        const T* begin() const noexcept; // 返回指向第一個元素的指針
        const T* end() const noexcept; // 返回指向最后一個元素之后的位置的指針
    };
}

3.2 Initializer_list 初始化容器 

當(dāng)使用vector時,每次都用不同數(shù)量的值初始化容器,那么就要寫非常多的構(gòu)造函數(shù)來實現(xiàn)這個需求。

但是用Initializer_list就可以一勞永逸的解決這個問題。

int main()
{
	// 用 10 個 1 構(gòu)造 vector
	vector<int> v(10, 1);

	initializer_list<int> il = { 10,9,8,5 };
	vector<int>(il);
	
	vector<int> v1 = { 1,2,3,4,5,6 };
	vector<int> v2({ 9,8,7,6,5,4 });

	return 0;
}

兩種構(gòu)造的區(qū)別:

對于:vector<int> v1 = { 1,2,3,4,5,6 };

  • 編譯器會先將{ 1,2,3,4,5,6 }識別成initializer_list;
  • 然后調(diào)用Initializer_list的構(gòu)造,中間生成臨時變量;
  • 最后拷貝構(gòu)造給v1;
  • 但是編譯器會優(yōu)化成直接構(gòu)造。

對于:vector<int> v2({ 9,8,7,6,5,4 });

  • 這就是直接構(gòu)造。
  • 總的來說,形如:X自定義 = Y類型 一定發(fā)生了 隱式類型轉(zhuǎn)換。X 支持 Y 為參數(shù)類型構(gòu)造就可以。

對于 map 的 initializer_list 的構(gòu)造

map 支持 pair 類型的 initializer_list 的構(gòu)造:

在這里插入圖片描述

這里的 value_type 就是 pair。

map構(gòu)造代碼示意:

int main()
{
	// 方法一:
	pair<string, string> kv1 = { "include", "包括" };
	pair<string, string> kv2 = { "sort","排序" };
	map<string, string> dict1({ kv1, kv2 });

	// 方法二:
	map<string, string> dict2 = { kv1, kv2 };
	map<string, string> dict3 = {{"include", "包括"}, { "sort","排序" }};
	
	return 0;
}

兩種構(gòu)造區(qū)別:

對于方法一:

  • 因為pair支持雙參數(shù)的構(gòu)造函數(shù),所以{ "include", "包括" }、 { "sort","排序" }會發(fā)生隱式類型的轉(zhuǎn)換生成臨時變量,然后再拷貝構(gòu)造給kv1,kv2(編譯器會優(yōu)化成直接構(gòu)造);
  • 因為map 支持 pair 類型的 initializer_list 的構(gòu)造,因此直接使用:map<string, string> dict1({ kv1, kv2 });即可

對于方法二:

  • {"include", "包括"}, { "sort","排序" }會被識別成兩個pair類型;
  • 然后外層大括號會被識別成initializer_list,進(jìn)行隱式類型轉(zhuǎn)換,在進(jìn)行拷貝構(gòu)造(會被優(yōu)化)。

到此這篇關(guān)于C++11中隱式類型轉(zhuǎn)換的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C++11 隱式類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解分析

    C語言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解分析

    鏈表可以說是一種最為基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)了,而單向鏈表更是基礎(chǔ)中的基礎(chǔ)。鏈表是由一組元素以特定的順序組合或鏈接在一起的,不同元素之間在邏輯上相鄰,但是在物理上并不一定相鄰。在維護(hù)一組數(shù)據(jù)集合時,就可以使用鏈表,這一點和數(shù)組很相似
    2021-11-11
  • 淺談c++性能測試工具google benchmark

    淺談c++性能測試工具google benchmark

    本文將會介紹如何使用模板以及參數(shù)生成器來批量生成測試用例,簡化繁瑣的性能測試代碼
    2021-06-06
  • 深入解析C++中的虛函數(shù)與多態(tài)

    深入解析C++中的虛函數(shù)與多態(tài)

    對C++ 了解的人都應(yīng)該知道虛函數(shù)(Virtual Function)是通過一張?zhí)摵瘮?shù)表(Virtual Table)和一個指向虛函數(shù)表的指針(vptr)來實現(xiàn)的
    2013-09-09
  • 利用C語言實現(xiàn)猜數(shù)字游戲

    利用C語言實現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家詳細(xì)介紹了利用C語言實現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 帶你了解C++中的sort函數(shù)

    帶你了解C++中的sort函數(shù)

    這篇文章主要給大家介紹了關(guān)于C++中sort函數(shù)的基礎(chǔ)入門使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧
    2021-08-08
  • 關(guān)于C++中由于字節(jié)對齊引起內(nèi)存問題定位分析

    關(guān)于C++中由于字節(jié)對齊引起內(nèi)存問題定位分析

    前幾天遇到一個稀奇古怪的問題,在創(chuàng)建對象的時候程序異常退出,查找代碼發(fā)現(xiàn)結(jié)構(gòu)體數(shù)組問題,最終把問題簡化得到解決方法,下面小編把我的問題及解決方案分享到腳本之家平臺供大家參考下
    2021-06-06
  • 深入探討:linux中遍歷文件夾下的所有文件

    深入探討:linux中遍歷文件夾下的所有文件

    本篇文章是對linux中遍歷文件夾下的所有文件進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c++實現(xiàn)超簡單的貪吃蛇游戲?qū)嵗榻B

    c++實現(xiàn)超簡單的貪吃蛇游戲?qū)嵗榻B

    大家好,本篇文章主要講的是c++實現(xiàn)超簡單的貪吃蛇游戲?qū)嵗榻B,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 分析C語言一個簡單程序

    分析C語言一個簡單程序

    本文主要介紹C語言簡單的程序,這里給大家詳細(xì)介紹C語言代碼,對函數(shù)概念、頭文件、自定義函數(shù)等基礎(chǔ)信息的講解,希望能幫助剛剛學(xué)習(xí)的同學(xué)
    2016-07-07
  • C語言編程C++動態(tài)內(nèi)存分配示例講解

    C語言編程C++動態(tài)內(nèi)存分配示例講解

    這篇文章主要介紹了C語言編程C++動態(tài)內(nèi)存分配示例講解,為什么存在動態(tài)內(nèi)存分配?本文通過動態(tài)內(nèi)存介紹及常見內(nèi)存錯誤等示例來為大家講解
    2021-09-09

最新評論

乐安县| 清涧县| 剑阁县| 昭平县| 迁西县| 洪湖市| 增城市| 始兴县| 桑日县| 卓资县| 博爱县| 靖远县| 宜黄县| 靖江市| 广汉市| 乳山市| 宣恩县| 遵义市| 泰安市| 绥芬河市| 寻乌县| 类乌齐县| 固原市| 宜黄县| 神池县| 周至县| 南丰县| 历史| 平山县| 抚顺县| 泽普县| 沙田区| 普洱| 长汀县| 英超| 乐陵市| 德昌县| 卓资县| 海丰县| 嫩江县| 三门峡市|