[C++]模板初階詳解-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)公司的客戶來自各行各業(yè),為了共同目標(biāo),我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領(lǐng)域包括網(wǎng)站建設(shè)、成都做網(wǎng)站、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。1.?模板的誕生

如何實(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ù)僅僅是類型不同,代碼復(fù)用率比較低,只要有新類型出現(xiàn)時(shí),就需要用戶自己增加對應(yīng)的函 數(shù)。
  2. 代碼的可維護(hù)性比較低,一個(gè)出錯(cuò)可能所有的重載均出錯(cuò)。

那能否告訴編譯器一個(gè)模子,讓編譯器根據(jù)不同的類型利用該模子來生成代碼呢?

于是C++便加入了模板來解決這一問題。

模板分類:

2. 函數(shù)模板 2.1函數(shù)模板的概念

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

2.2?函數(shù)模板格式

template

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

舉例:

templatevoid Swap( T& left, T& right)
{
 T temp = left;
 left = right;
 right = temp;
}

注意:typename是用來定義模板參數(shù)關(guān)鍵字,也可以使用class(切記:不能使用struct代替class)

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

那么如何解決上面的問題呢?大家都知道,瓦特改良蒸汽機(jī),人類開始了工業(yè)革命,解放了生產(chǎn)力。機(jī)器生 產(chǎn)淘汰掉了很多手工產(chǎn)品。本質(zhì)是什么,重復(fù)的工作交給了機(jī)器去完成。有人給出了論調(diào):懶人創(chuàng)造世界。

函數(shù)模板是一個(gè)藍(lán)圖,它本身并不是函數(shù),是編譯器用使用方式產(chǎn)生特定具體類型函數(shù)的模具。所以其實(shí)模板就是將本來應(yīng)該我們做的重復(fù)的事情交給了編譯器。

在編譯器編譯階段,對于模板函數(shù)的使用,編譯器需要根據(jù)傳入的實(shí)參類型來推演生成對應(yīng)類型的函數(shù)以供調(diào)用。比如:當(dāng)用double類型使用函數(shù)模板時(shí),編譯器通過對實(shí)參類型的推演,將T確定為double類型,然 后產(chǎn)生一份專門處理double類型的代碼,對于字符類型也是如此 。

2.4?模板的實(shí)例化

用不同類型的參數(shù)使用函數(shù)模板時(shí),稱為函數(shù)模板的實(shí)例化。模板參數(shù)實(shí)例化分為:隱式實(shí)例化和顯式實(shí)例化。

  1. 隱式實(shí)例化:讓編譯器根據(jù)實(shí)參推演模板參數(shù)的實(shí)際類型

例如:

templateT Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.15, d2 = 20.2;
	cout<< Add(a1, a2)<< endl;
	cout<< Add(d1, d2)<< endl;
	cout<< Add(a1, d1)<< endl;
	return 0;
}

上面代碼不能編譯通過,因?yàn)樵诰幾g期間,當(dāng)編譯器看到該實(shí)例化時(shí),需要推演其實(shí)參類型 通過實(shí)參 a1?將T推演為int,通過實(shí)參 d1?將T推演為double類型,但模板參數(shù)列表中只有一個(gè)T, 編譯器無法確定此處到底該將T確定為int 或者 double類型而報(bào)錯(cuò)。

因此,在模板中,編譯器一般不會進(jìn)行類型轉(zhuǎn)換操作,因?yàn)橐坏┺D(zhuǎn)化出問題,編譯器就需要背黑鍋。

對此,有兩種解決方法:

?1. 用戶自己來強(qiáng)制轉(zhuǎn)化

cout<< Add(a1, (int)d1)<< endl;
	cout<< Add((double)a1,d1)<< endl;

? 2. 使用顯式實(shí)例化

cout<< Add(a1,d1)<< endl;
	cout<< Add(a1,d1)<< endl;

? 3.? 創(chuàng)建兩個(gè)模板

templateT1 Add( const T1& left, const T2& right)
{
	return left + right;
}
int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.15, d2 = 20.2;
	cout<< Add(a1, d1)<< endl;
	cout<< Add(a2, d2)<< endl;
    return 0;
}

注意:

T Add(const T& left, const T& right)

函數(shù)Add中形參的const不能丟,因?yàn)樵陔[式類型轉(zhuǎn)換時(shí)會生成一個(gè)臨時(shí)對象,這個(gè)臨時(shí)對象具有常性,就導(dǎo)致無法傳參,屬于權(quán)限的放大。

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

1. 一個(gè)非模板函數(shù)可以和一個(gè)同名的函數(shù)模板同時(shí)存在,而且該函數(shù)模板還可以被實(shí)例化為這個(gè)非模板函數(shù)

// 專門處理int的加法函數(shù)
int Add(int left, int right)
{
 return left + right;
}
// 通用加法函數(shù)
templateT Add(T left, T right)
{
 return left + right;
}
void Test()
{
 Add(1, 2); // 與非模板函數(shù)匹配,編譯器不需要特化
 Add(1, 2); // 調(diào)用編譯器特化的Add版本
}

2. 對于非模板函數(shù)和同名函數(shù)模板,如果其他條件都相同,在調(diào)動(dòng)時(shí)會優(yōu)先調(diào)用非模板函數(shù)而不會從該模板產(chǎn)生出一個(gè)實(shí)例。如果模板可以產(chǎn)生一個(gè)具有更好匹配的函數(shù), 那么將選擇模板。

// 專門處理int的加法函數(shù)
int Add(int left, int right)
{
 return left + right;
}
// 通用加法函數(shù)
templateT1 Add(T1 left, T2 right)
{
 return left + right;
}
void Test()
{
 Add(1, 2); // 與非函數(shù)模板類型完全匹配,不需要函數(shù)模板實(shí)例化
 Add(1, 2.0); // 模板函數(shù)可以生成更加匹配的版本,編譯器根據(jù)實(shí)參生成更加匹配的Add函
數(shù)
}

3. 模板函數(shù)不允許自動(dòng)類型轉(zhuǎn)換,但普通函數(shù)可以進(jìn)行自動(dòng)類型轉(zhuǎn)換

3. 類模板 3.1 類模板的定義格式

我們用棧來舉例:

//類模板
templateclass Stack
{
public:
	Stack(int capacity = 4)
	{
		cout<< "Satck(int capacity = )"<< capacity<< endl;
		_a = (Type*)malloc(sizeof(Type) * capacity);
		if (_a == nullptr)
		{
			perror("malloc fail");
			exit(-1);
		}
		
	}
	
	void Push(const Type x)
	{
		//擴(kuò)容
		_a[_top++] = x;
	}
	~Stack()
	{
		cout<< "~Stack()"<< endl;
		free(_a);
		_a = nullptr;
		_top = _capacity = 0;
	}
private:
	Type _a;
	int _top;
	int _capacity;
};
int main()
{
	//類模板一般沒有推演時(shí)機(jī),函數(shù)模板實(shí)參傳遞形參,推演函數(shù)模板
	//顯示示例化
	Stackst1;//double
	st1.Push(1.1);
	Stackst2;//int
	st2.Push(1);
	return 0;
}
3.2 類模板的實(shí)例化

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

Stack類名;Stack,Stack才是類型
Stackst1;
Stackst2;

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

名稱欄目:[C++]模板初階詳解-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://bm7419.com/article0/gddoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站網(wǎng)站營銷、營銷型網(wǎng)站建設(shè)、網(wǎng)站收錄、品牌網(wǎng)站設(shè)計(jì)、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)