C++-----模板-創(chuàng)新互聯(lián)

舉個例子,如果要你交換兩個數(shù)值,你會怎么做呢?

成都創(chuàng)新互聯(lián)公司主要為客戶提供服務項目涵蓋了網頁視覺設計、VI標志設計、全網整合營銷推廣、網站程序開發(fā)、HTML5響應式重慶網站建設公司手機網站開發(fā)、微商城、網站托管及成都網站維護公司、WEB系統(tǒng)開發(fā)、域名注冊、國內外服務器租用、視頻、平面設計、SEO優(yōu)化排名。設計、前端、后端三個建站步驟的完善服務體系。一人跟蹤測試的建站服務標準。已經為生料攪拌車行業(yè)客戶提供了網站營銷服務。

————你肯定會說,那就寫一個Swap交換函數(shù)吧!

沒錯!Swap函數(shù)確實可以實現(xiàn)交換,但如果我想讓你同時進行不能類型的數(shù)值呢,比如float、double、int、short.......等,你打算怎么實現(xiàn)呢?

————函數(shù)重載!當然可以,函數(shù)重載來實現(xiàn)完成沒毛病。但是你想想,如果有很多個不同的類型需要進行交換,那你覺得你需要寫多少個函數(shù)重載來實現(xiàn)呢?

肯定的!這相當麻煩。

而且還存在如下問題:

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

為了解決這個問題,我們就可以通過函數(shù)模板來實現(xiàn):

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

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

(模板是泛型編程的基礎)

2.格式:

template

typename 是用來定義模板參數(shù)關鍵字,也可以用class代替。

Swap實例:

templatevoid Swap(T& a, T& b)
{
	T tmp = a;
	a = b;
	b = tmp;
}
int main() {
	int a = 10, b = 20;
	std::cout<< "a="<< a<< " b="<< b<< std::endl;
	Swap(a, b);
	std::cout<<"a="<< a<< " b="<< b<< std::endl;
	double m = 1.3, n = 2.3;
	std::cout<< "m="<< m<< " n="<< n<< std::endl;
	Swap(m, n);
	std::cout<< "m="<< m<< " n="<< n<< std::endl;
}

3.原理:

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

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

4.函數(shù)模板實例化:

用不同類型的參數(shù)使用函數(shù)模板時即為函數(shù)模板實例化。

函數(shù)模板實例化分為:隱式實例化和顯式實例化。

隱式實例化:

讓編譯器根據(jù)實參推演模板參數(shù)的實際類型。

templateT Add(const T& a,const T& b)
{
	return a + b;
}
int main() {
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.0;
	std::cout<< "Add="<< Add(a1, d1)<< std::endl;
	std::cout<< "Add="<< a2 + d2<< std::endl;
}

先看這段代碼,在我們編譯時會過不了。

該語句不能通過編譯,因為在編譯期間,當編譯器看到該實例化時,需要推演其實參類型通過實參a1將T推演為int,通過實參d1將T推演為double類型,但模板參數(shù)列表中只有一個T,編譯器無法確定此處到底該將T確定為int 或者 double類型而報錯
注意:在模板中,編譯器一般不會進行類型轉換操作,因為一旦轉化出問題,編譯器就需要背黑鍋

所以有兩種處理方法:1. 用戶自己來強制轉換; 2.使用顯示實例化。

方法1:

templateT Add(const T& a,const T& b)
{
	return a + b;
}
int main() {
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.0;
	std::cout<< "Add="<< Add(a1, (int)d1)<< std::endl;
	std::cout<< "Add="<< a2 + d2<< std::endl;
}

顯式實例化:?

在函數(shù)名后<>中指定模板參數(shù)的實際類型。

templateT Add(const T& a,const T& b)
{
	return a + b;
}
int main() {
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.0;
	std::cout<< "Add<>()="<< Add(a1, d1)<< std::endl;//顯式實例化
	std::cout<< "Add="<< a2 + d2<< std::endl;
}

注意:如果參數(shù)不匹配,編譯器會嘗試進行隱式類型轉換,如果無法轉換成功編譯器會報錯。

5.函數(shù)模板匹配原則:

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

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

3.模板函數(shù)不允許自動類型轉換,但普通函數(shù)可以進行自動類型轉換

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

當前題目:C++-----模板-創(chuàng)新互聯(lián)
標題路徑:http://m.kartarina.com/article32/egspc.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)關鍵詞優(yōu)化電子商務移動網站建設外貿網站建設網站排名

廣告

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

微信小程序開發(fā)
主站蜘蛛池模板: 东京热av人妻无码| 无码少妇一区二区浪潮免费| 无码人妻AV一二区二区三区| 日日麻批免费40分钟无码| 亚洲6080yy久久无码产自国产| 中文字幕av无码不卡免费| 亚洲精品无码日韩国产不卡av| 人妻少妇伦在线无码| 亚洲av纯肉无码精品动漫| 人妻丰满av无码中文字幕| 东京热加勒比无码少妇| 五月天无码在线观看| 久久人午夜亚洲精品无码区 | 久久久久亚洲AV成人无码网站| 无码乱肉视频免费大全合集| 亚洲精品中文字幕无码蜜桃| 永久免费无码日韩视频| 免费人妻无码不卡中文字幕18禁| 亚洲AV无码1区2区久久| 东京热人妻无码一区二区av| 日韩专区无码人妻| 国产精品无码一区二区在线观| 无码av免费一区二区三区| av无码人妻一区二区三区牛牛 | 精品无码国产一区二区三区51安| 日韩免费人妻AV无码专区蜜桃 | 在线高清无码A.| 中文字幕乱偷无码AV先锋| 亚洲熟妇少妇任你躁在线观看无码| 亚洲看片无码在线视频| 中文字幕无码亚洲欧洲日韩| 精品欧洲AV无码一区二区男男| 久久精品亚洲中文字幕无码麻豆| 国产AV无码专区亚洲A∨毛片| 国产激情无码一区二区app| 亚洲av无码一区二区三区网站| 国产成人精品无码片区在线观看| 国产精品无码无卡在线播放| 成在线人免费无码高潮喷水| 国产AV无码专区亚汌A√ | 无码人妻精品一区二区在线视频|