日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C++深入了解模板的使用_C 語(yǔ)言

作者:beyond.myself ? 更新時(shí)間: 2022-08-16 編程語(yǔ)言

一.泛型編程

泛型編程:不再是針對(duì)某種類(lèi)型,能適應(yīng)廣泛的類(lèi)型,跟具體的類(lèi)型無(wú)關(guān)的代碼

如何實(shí)現(xiàn)一個(gè)通用的交換函數(shù)呢?

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;
}

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

因此我們需要告訴編譯器一個(gè)模子,讓編譯器根據(jù)不同的類(lèi)型利用該模子來(lái)生成代碼

二.函數(shù)模板

模板分為:函數(shù)模板,類(lèi)模板

1.函數(shù)模板概念

函數(shù)模板代表了一個(gè)函數(shù)家族,該函數(shù)模板與類(lèi)型無(wú)關(guān),在使用時(shí)被參數(shù)化,根據(jù)實(shí)參類(lèi)型產(chǎn)生 函數(shù)的特定類(lèi)型版本。

2.函數(shù)模板格式

template<typename T>

返回值類(lèi)型 函數(shù)名(參數(shù)列表){}

說(shuō)明:

1.template<class T> 和 template<typename T>在此暫時(shí)認(rèn)為一樣,template<struct T>是 錯(cuò)誤的 ,沒(méi)有這種寫(xiě)法

2.T是type的縮寫(xiě),T不一定寫(xiě)T,可以寫(xiě)任意字母,比如X,t ……但是習(xí)慣寫(xiě)為T(mén)

舉例:

template<typename T>    //或template<class T>
void Swap(T& left, T& right)
{
	T tmp = left;
	left = right;
	right = tmp;
}
int main()
{
	int a = 0, b = 1;
	double c = 2.2, d = 3.3;
	swap(a, b);
	swap(c, d);
	return 0;
}

swap(a, b);swap(c, d); 調(diào)用的是同一個(gè)函數(shù)嗎?

答:不是同一個(gè)。底層匯編可以看出不是同一個(gè),如果調(diào)試時(shí)發(fā)現(xiàn)走的是同一個(gè)函數(shù),其實(shí)是編譯器的優(yōu)化導(dǎo)致。

實(shí)際上以后swap函數(shù)都不用自己寫(xiě)了,庫(kù)中有模板,直接用就行

3.函數(shù)模板的原理

在編譯器編譯階段 ,對(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)型也是如此。 模板的實(shí)例化:

三.類(lèi)模板

類(lèi)模板的定義格式

template < class T1 , class T2 , ..., class Tn >

class 類(lèi)模板名

{

// 類(lèi)內(nèi)成員定義

};

舉例:調(diào)用 Stack<int> st1; 時(shí),用int替換模板中的T。調(diào)用 Stack<double> st1; 時(shí),用double替換模板中的T

// 類(lèi)模板
template<class T>
class Stack
{
public:
	Stack(int capacity = 0)
	{
		_a = new T[capacity];
		_capacity = capacity;
		_top = 0;
	}
	~Stack()
	{
		cout << "~Stack()" << endl;
		delete[] _a;
		_capacity = 0;
		_top = 0;
	}
	void Push(const T& x)
	{}
private:
	T* _a;
	int _top;
	int _capacity;
};
int main()
{
	Stack<int> st1; // int
	st1.Push(1);
	Stack<double> st2; // double
	st2.Push(2.2);
	return 0;
}

原文鏈接:https://blog.csdn.net/zhang_si_hang/article/details/125323152

欄目分類(lèi)
最近更新