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

【C++】——模板(泛型編程+函數(shù)模板+類(lèi)模板)

這篇具有很好參考價(jià)值的文章主要介紹了【C++】——模板(泛型編程+函數(shù)模板+類(lèi)模板)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 前言

之前我們學(xué)習(xí)了函數(shù)重載,讓我們?cè)趯?xiě)相似函數(shù)的時(shí)候非常方便,但函數(shù)重載還有很多不足的地方,比如,每次寫(xiě)相似函數(shù)的時(shí)候,都要我們重新重載一個(gè)邏輯、代碼幾乎一樣的函數(shù),這就導(dǎo)致了我們的效率變低,所以我們今天來(lái)學(xué)習(xí)C++模板的相關(guān)知識(shí)點(diǎn),學(xué)習(xí)完模板之后,我們就可以很好的解決這些問(wèn)題。

2. 泛型編程

以前我們要實(shí)現(xiàn)一個(gè)通用的交換函數(shù)時(shí)是怎么做的呢?我們利用了函數(shù)重載,把可能用到的函數(shù)都重載出來(lái)。

void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}

void Swap(double& left, double& right)
{
	double temp = left;
	left = right;
	right = temp;
}

void Swap(char& left, char& right)
{
	char temp = left;
	left = right;
	right = temp;
}

使用函數(shù)重載雖然可以做到,但是有幾個(gè)不足的地方:

1.重載的函數(shù)僅僅是類(lèi)型不同,代碼復(fù)用率比較低,只要有新類(lèi)型出現(xiàn)時(shí),就需要用戶(hù)自己增加對(duì)應(yīng)的函數(shù)
2.代碼的可維護(hù)性比較低,一個(gè)出錯(cuò)可能所有的重載均出錯(cuò)

那么我們?cè)撊绾谓鉀Q這個(gè)問(wèn)題呢?
如果在C++中,能夠存在一個(gè)模具,通過(guò)給這個(gè)模具中填充不同材料(類(lèi)型),來(lái)獲得不同材料的鑄件(即生成具體類(lèi)型的代碼)這樣就會(huì)讓我們大幅提高效率。

泛型編程
編寫(xiě)與類(lèi)型無(wú)關(guān)的通用代碼,是代碼復(fù)用的一種手段。
模板是泛型編程的基礎(chǔ)。模板又分為函數(shù)模板和類(lèi)模板。

3. 函數(shù)模板

概念
函數(shù)模板代表了一個(gè)函數(shù)家族,該函數(shù)模板與類(lèi)型無(wú)關(guān),在使用時(shí)被參數(shù)化,根據(jù)實(shí)參類(lèi)型產(chǎn)生函數(shù)的特定類(lèi)型版本。
格式
template<typename T1, typename T2,…,typename Tn>
返回值類(lèi)型 函數(shù)名(參數(shù)列表) {}
注意
typename是用來(lái)定義模板參數(shù)關(guān)鍵字,也可以使用class。
typename后面類(lèi)型名字T是隨便取的。

//template<typename T>
template<class T>
void Swap(T& left, T& right)
{
	T tmp = left;
	left = right;
	right = tmp;
}

3.1 函數(shù)模板的原理

函數(shù)模板是一個(gè)藍(lán)圖,它本身并不是函數(shù),是編譯器用使用方式產(chǎn)生特定具體類(lèi)型函數(shù)的模具。所以其實(shí)模板就是將本來(lái)應(yīng)該我們做的重復(fù)的事情交給了編譯器。
在編譯器編譯階段,對(duì)于模板函數(shù)的使用,編譯器需要根據(jù)傳入的實(shí)參類(lèi)型來(lái)推演生成對(duì)應(yīng)類(lèi)型的函數(shù)以供調(diào)用。
比如:當(dāng)用double類(lèi)型使用函數(shù)模板時(shí),編譯器通過(guò)對(duì)實(shí)參類(lèi)型的推演,將T確定為double類(lèi)型,然后產(chǎn)生一份專(zhuān)門(mén)處理double類(lèi)型的代碼,對(duì)于字符類(lèi)型也是如此。

3.2 函數(shù)模板的實(shí)例化

用不同類(lèi)型的參數(shù)使用函數(shù)模板時(shí),稱(chēng)為函數(shù)模板的實(shí)例化。模板參數(shù)實(shí)例化分為:隱式實(shí)例化和顯式實(shí)例化。
隱式實(shí)例化:讓編譯器根據(jù)實(shí)參推演模板參數(shù)的實(shí)際類(lèi)型
顯式實(shí)例化:在函數(shù)名后的<>中指定模板參數(shù)的實(shí)際類(lèi)型

template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}

int main()
{
	int a = 1, b = 2;
	double c = 1.1, d = 2.2;

	//編譯器自動(dòng)推演,隱式實(shí)例化
	cout << Add(a, b) << endl;
	cout << Add(c, d) << endl;

	//推演實(shí)例化矛盾,編譯器無(wú)法確定此處到底該將T確定為int或者double類(lèi)型而報(bào)錯(cuò)
	//cout << Add(a, d) << endl;

	//倆種處理方式:1、強(qiáng)制轉(zhuǎn)換類(lèi)型   2、顯示實(shí)例化
	//1.強(qiáng)制轉(zhuǎn)換類(lèi)型
	cout << Add((double)a, d) << endl;
	cout << Add(a, (int)d) << endl;

	//2.顯示實(shí)例化
	cout << Add<double>(a, d) << endl;
	cout << Add<int>(a, d) << endl;

	return 0;
}

【C++】——模板(泛型編程+函數(shù)模板+類(lèi)模板)

3.3 模板參數(shù)的匹配原則

1.一個(gè)非模板函數(shù)可以和一個(gè)同名的函數(shù)模板同時(shí)存在,而且該函數(shù)模板還可以被實(shí)例化為這個(gè)非模板函數(shù)。
2.對(duì)于非模板函數(shù)和同名函數(shù)模板,如果其他條件都相同,在調(diào)動(dòng)時(shí)會(huì)優(yōu)先調(diào)用非模板函數(shù)而不會(huì)從該模板產(chǎn)生出一個(gè)實(shí)例。如果模板可以產(chǎn)生一個(gè)具有更好匹配的函數(shù), 那么將選擇模板。
3.模板函數(shù)不允許自動(dòng)類(lèi)型轉(zhuǎn)換,但普通函數(shù)可以進(jìn)行自動(dòng)類(lèi)型轉(zhuǎn)換。

//專(zhuān)門(mén)處理加法的函數(shù)
int Add(const int& x, const int& y)
{
	return x + y;
}

//通用加法函數(shù)
template<class T>
T Add(const T& x, const T& y)
{
	return x + y;
}

template<class T1, class T2>
T2 Add(const T1& x, const T2& y)
{
	return x + y;
}

int main()
{
	cout << Add(1, 2) << endl;//調(diào)用int Add函數(shù)
	cout << Add(1.1, 2.2) << endl;//調(diào)用T Add函數(shù)
	cout << Add(1, 2.2) << endl;//調(diào)用T2 Add函數(shù)

	return 0;
}

4. 類(lèi)模板

格式
template<class T1, class T2, …, class Tn>
class 類(lèi)模板名
{
// 類(lèi)內(nèi)成員定義
};

template<class T>
class Stack
{
public:
	Stack(size_t capacity = 4)
		:_a(nullptr)
		,_top(0)
		,_capacity(0)
	{
		if (capacity > 0)
		{
			_a = new T[capacity];
			_capacity = capacity;
			_top = 0;
		}
	}

	~Stack()
	{
		delete[] _a;
		_a = nullptr;
		_top = _capacity = 0;
	}

	void Push(const T& x)
	{}
	//注意:類(lèi)模板中函數(shù)放在類(lèi)外進(jìn)行定義時(shí),需要加模板參數(shù)列表

private:
	T* _a;
	size_t _top;
	size_t _capacity;
};

注意:類(lèi)模板中函數(shù)放在類(lèi)外進(jìn)行定義時(shí),需要加模板參數(shù)列表

4.1 類(lèi)模板的實(shí)例化

類(lèi)模板實(shí)例化與函數(shù)模板實(shí)例化不同,類(lèi)模板實(shí)例化需要在類(lèi)模板名字后跟<>,然后將實(shí)例化的類(lèi)型放在<>中即可,類(lèi)模板名字不是真正的類(lèi),而實(shí)例化的結(jié)果才是真正的類(lèi)。

template<class T>
class Stack//這里Stack不是具體的類(lèi),是編譯器根據(jù)被實(shí)例化的類(lèi)型生成具體類(lèi)的模具
{
public:
	Stack(size_t capacity = 4)
		:_a(nullptr)
		,_top(0)
		,_capacity(0)
	{
		if (capacity > 0)
		{
			_a = new T[capacity];
			_capacity = capacity;
			_top = 0;
		}
	}

	~Stack()
	{
		delete[] _a;
		_a = nullptr;
		_top = _capacity = 0;
	}

	void Push(const T& x)
	{}

private:
	T* _a;
	size_t _top;
	size_t _capacity;
};

int main()
{
	//類(lèi)模板都是顯示實(shí)例化
	//雖然他們用了一個(gè)類(lèi)模板,但是Stack<int>,Stack<char>是兩個(gè)類(lèi)型
	Stack<int> st1;
	Stack<char> st2;
	
	//知道要存多少個(gè)數(shù)據(jù),避免插入時(shí)擴(kuò)容消耗
	Stack<int> st3(100);

	return 0;
}

注意
1.類(lèi)模板必須顯示實(shí)例化。
2.雖然上面兩個(gè)對(duì)象用了同一個(gè)類(lèi)模板,但是Stack<int>,Stack<char>是兩個(gè)不同的類(lèi)型。

5. 結(jié)尾

C++模板入門(mén)的相關(guān)知識(shí)點(diǎn)我們就學(xué)習(xí)完了,學(xué)了模板以后,在很多地方我們就可以用模板來(lái)實(shí)現(xiàn),而不是重載函數(shù),這能極大的提高效率和可維護(hù)性。
最后,感謝各位大佬的耐心閱讀和支持,覺(jué)得本篇文章寫(xiě)的不錯(cuò)的朋友可以三連關(guān)注支持一波,如果有什么問(wèn)題或者本文有錯(cuò)誤的地方大家可以私信我,也可以在評(píng)論區(qū)留言討論,再次感謝各位。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-453830.html

到了這里,關(guān)于【C++】——模板(泛型編程+函數(shù)模板+類(lèi)模板)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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)文章

  • 【C++】泛型編程 ① ( 函數(shù)模板 | 函數(shù)模板概念 | 函數(shù)模板意義 | 函數(shù)模板定義語(yǔ)法 | 函數(shù)模板調(diào)用語(yǔ)法 | 顯式類(lèi)型調(diào)用 | 自動(dòng)類(lèi)型推導(dǎo) )

    【C++】泛型編程 ① ( 函數(shù)模板 | 函數(shù)模板概念 | 函數(shù)模板意義 | 函數(shù)模板定義語(yǔ)法 | 函數(shù)模板調(diào)用語(yǔ)法 | 顯式類(lèi)型調(diào)用 | 自動(dòng)類(lèi)型推導(dǎo) )

    在 C++ 語(yǔ)言中 , 泛型編程 的 核心就是 函數(shù)模板 和 類(lèi)模板 ; 函數(shù)模板 Function Template 是 C++ 語(yǔ)言 中的 重要特性 ; 函數(shù)模板概念 : 建立一個(gè) \\\" 通用函數(shù) \\\" , 不指定該函數(shù)的 函數(shù)返回值類(lèi)型 和 函數(shù)參數(shù)類(lèi)型 , 僅使用 \\\" 虛擬類(lèi)型 \\\" 代表 上述 兩種類(lèi)型 , 該 \\\" 通用函數(shù) \\\" 就是 \\\" 函數(shù)模

    2024年02月19日
    瀏覽(28)
  • C++、STL標(biāo)準(zhǔn)模板庫(kù)和泛型編程 ——迭代器、 算法、仿函數(shù)(侯捷)

    C++、STL標(biāo)準(zhǔn)模板庫(kù)和泛型編程 ——迭代器、 算法、仿函數(shù)(侯捷)

    侯捷 C++八部曲筆記匯總 - - - 持續(xù)更新 ! ! ! 一、C++ 面向?qū)ο蟾呒?jí)開(kāi)發(fā) 1、C++面向?qū)ο蟾呒?jí)編程(上) 2、C++面向?qū)ο蟾呒?jí)編程(下) 二、STL 標(biāo)準(zhǔn)庫(kù)和泛型編程 1、分配器、序列式容器 2、關(guān)聯(lián)式容器 3、迭代器、 算法、仿函數(shù) 4、適配器、補(bǔ)充 三、C++ 設(shè)計(jì)模式 四、C++ 新標(biāo)準(zhǔn) 五、

    2023年04月25日
    瀏覽(34)
  • C++泛型編程之模板

    C++泛型編程之模板

    目錄 一、什么是泛型編程? 二、函數(shù)模板 2.1函數(shù)模板的概念 2.2函數(shù)模板格式 2.3函數(shù)模板的原理 ?2.5函數(shù)模板的實(shí)例化 2.6模板參數(shù)的匹配原則 三、類(lèi)模板 3.1類(lèi)模板的定義格式 3.2 類(lèi)模板的實(shí)例化 四、非類(lèi)型模板參數(shù) 五、模板的特化 5.1模板特化的概念: 5.2函數(shù)模板特化 5

    2024年02月07日
    瀏覽(19)
  • 【C++】泛型編程——模板進(jìn)階

    【C++】泛型編程——模板進(jìn)階

    在之前的文章里,我們進(jìn)行了模板初階的學(xué)習(xí)( 【C++】泛型編程——模板初階),了解了什么是泛型編程,學(xué)習(xí)了函數(shù)模板和類(lèi)模板。 那這篇文章,我們繼續(xù)學(xué)習(xí)模板進(jìn)階的內(nèi)容的學(xué)習(xí)。 首先我們來(lái)回顧一下: 我們?cè)谀0宄蹼A的學(xué)習(xí)中,定義模板參數(shù)是怎么定義的? 是不

    2024年02月16日
    瀏覽(19)
  • 【C++】C++泛型編程 | 模板初階

    【C++】C++泛型編程 | 模板初階

    ??????? 個(gè)人主頁(yè):簡(jiǎn) 料 ???? 所屬專(zhuān)欄:C++ ???? 個(gè)人社區(qū):越努力越幸運(yùn)社區(qū) ???? 簡(jiǎn)? ? ?? 介: 簡(jiǎn)料簡(jiǎn)料,簡(jiǎn)單有料~在校大學(xué)生一枚,專(zhuān)注C/C++/GO的干貨分享,立志成為您的好幫手 ~ C/C++學(xué)習(xí)路線 (點(diǎn)擊解鎖) ?? C語(yǔ)言 ?? 初階數(shù)據(jù)結(jié)構(gòu)與算法 ?? C++ ??

    2024年02月08日
    瀏覽(29)
  • 【C++基礎(chǔ)(十)】C++泛型編程--模板初階

    【C++基礎(chǔ)(十)】C++泛型編程--模板初階

    ??博主CSDN主頁(yè):杭電碼農(nóng)-NEO?? ? ?專(zhuān)欄分類(lèi):C++從入門(mén)到精通? ? ??代碼倉(cāng)庫(kù):NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)習(xí)C++ ? ???? 在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí)會(huì)遇見(jiàn)以下的情況 數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)的類(lèi)型往往不能確定 所以在實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)時(shí)往往是這樣做的 在寫(xiě)代碼時(shí)用DateType來(lái)表

    2024年02月13日
    瀏覽(47)
  • C++——模板初階與泛型編程

    C++——模板初階與泛型編程

    ??作者簡(jiǎn)介: 花想云 ,在讀本科生一枚,致力于 C/C++、Linux 學(xué)習(xí)。 ?? 本文收錄于 C++系列 ,本專(zhuān)欄主要內(nèi)容為 C++ 初階、C++ 進(jìn)階、STL 詳解等,專(zhuān)為大學(xué)生打造全套 C++ 學(xué)習(xí)教程,持續(xù)更新! ?? 相關(guān)專(zhuān)欄推薦: C語(yǔ)言初階系列 、 C語(yǔ)言進(jìn)階系列 、 數(shù)據(jù)結(jié)構(gòu)與算法 本章我們

    2023年04月17日
    瀏覽(13)
  • 【c++ primer 筆記】第 16章 模板與泛型編程

    【c++ primer 筆記】第 16章 模板與泛型編程

    ??作者簡(jiǎn)介:?? 博主在讀機(jī)器人研究生,目前研一。對(duì)計(jì)算機(jī)后端感興趣,喜歡 c + + , g o , p y t h o n , 目前熟悉 c + + , g o 語(yǔ)言,數(shù)據(jù)庫(kù),網(wǎng)絡(luò)編程,了解分布式等相關(guān)內(nèi)容 textcolor{orange}{博主在讀機(jī)器人研究生,目前研一。對(duì)計(jì)算機(jī)后端感興趣,喜歡c++,go,python,目前熟悉c+

    2024年02月20日
    瀏覽(28)
  • C++、STL標(biāo)準(zhǔn)模板庫(kù)和泛型編程 ——適配器、補(bǔ)充(侯捷)

    C++、STL標(biāo)準(zhǔn)模板庫(kù)和泛型編程 ——適配器、補(bǔ)充(侯捷)

    侯捷 C++八部曲筆記匯總 - - - 持續(xù)更新 ! ! ! 一、C++ 面向?qū)ο蟾呒?jí)開(kāi)發(fā) 1、C++面向?qū)ο蟾呒?jí)編程(上) 2、C++面向?qū)ο蟾呒?jí)編程(下) 二、STL 標(biāo)準(zhǔn)庫(kù)和泛型編程 1、分配器、序列式容器 2、關(guān)聯(lián)式容器 3、迭代器、 算法、仿函數(shù) 4、適配器、補(bǔ)充 三、C++ 設(shè)計(jì)模式 四、C++ 新標(biāo)準(zhǔn) 五、

    2023年04月27日
    瀏覽(28)
  • C++核心編程——詳解函數(shù)模板

    C++核心編程——詳解函數(shù)模板

    縱有疾風(fēng)起,人生不言棄。本文篇幅較長(zhǎng),如有錯(cuò)誤請(qǐng)不吝賜教,感謝支持。 ①為什么有模板? 在C++程序中,聲明變量、函數(shù)、對(duì)象等實(shí)體時(shí),程序設(shè)計(jì)者需要指定數(shù)據(jù)類(lèi)型,讓編譯器在程序運(yùn)行之前進(jìn)行類(lèi)型檢查并分配內(nèi)存,以提高程序運(yùn)行的安全性和效率。 但是這種強(qiáng)

    2024年02月09日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包