C++超詳細(xì)介紹模板
定義
函數(shù)模板不是一個(gè)實(shí)在的函數(shù),編譯器不能為其生成可執(zhí)行代碼。定義函數(shù)模板后只是一個(gè)對(duì)函數(shù)功能框架的描述,當(dāng)它具體執(zhí)行時(shí),將根據(jù)傳遞的實(shí)際參數(shù)決定其功能。
一個(gè)程序一般是經(jīng)過預(yù)處理——>編譯——>匯編——>鏈接。但是因?yàn)槌绦驘o法知道模板的具體類型(int,double),所以無法進(jìn)行預(yù)處理,也就不能生成可執(zhí)行代碼。
例子
下面我們來看一個(gè)例子
我們?cè)趯W(xué)習(xí)c語(yǔ)言的時(shí)候,當(dāng)我們需要交換兩個(gè)數(shù),我們是這樣做的
交換整數(shù)
void Swap(int & x, int & y) { int tmp = x; x = y; y = tmp; }
交換小數(shù)
void Swap (double & xr double & y) { double tmp = x; x = y; y = tmp; }
我們可以看出,只要類型做了變化,我們就需要重新寫一個(gè)幾乎不變的代碼,這是非常不方便的。
那么我們像活字印刷術(shù)一樣做一個(gè)模板出來讓編譯器根據(jù)自行推導(dǎo)類型呢?
于是模板就出現(xiàn)了。
對(duì)于上面的情況,我們模板是這樣處理的。
格式
template <class T> void Swap(T & x, T & y) { T tmp = x; x = y; y = tmp; } template <class T> void Swap(T& x, T& y) { T tmp = x; x = y; y = tmp; } int main() { int a = 3; int b = 2; Swap(a, b); cout << a << endl<< b << endl; return 0; }
template <class 類型參數(shù)1, class類型參數(shù)2, ...>
返回值類型 模板名(形參表)
{
函數(shù)體
}
意識(shí)就是說,我們?cè)谶@里用template定義了一個(gè)模板”T”,當(dāng)我們使用Swap的時(shí)候,計(jì)算機(jī)根據(jù)我們a,b(都是int)的類型,推出T應(yīng)當(dāng)是int 型。
實(shí)際上這個(gè)
void Swap(T & x, T & y)
變成了
void Swap (int & x, int & y)
但是需要注意,只有當(dāng)a,b都是同類型的時(shí)候,計(jì)算機(jī)才能自動(dòng)推到,如果是不同類型,我們將b換為double類型
template <class T> void Swap(T & x, T & y) { T tmp = x; x = y; y = tmp; } template <class T> void Swap(T& x, T& y) { T tmp = x; x = y; y = tmp; } int main() { int a = 3; double b = 2.5; Swap(a, b); cout << a << endl<< b << endl; return 0; }
就會(huì)出現(xiàn):
因?yàn)閮蓚€(gè)數(shù)一個(gè)int一個(gè)double,計(jì)算機(jī)就不知道給這個(gè)T賦int 還是double,這個(gè)時(shí)候有兩種處理方法
處理方法
第一種隱式實(shí)例化:讓編譯器根據(jù)實(shí)參推演模板參數(shù)的實(shí)際類型
#include<iostream> using namespace std; template<class T> T Add(const T& left, const T& right) { return left + right; } int main() { int a1 = 10, a2 = 20; double d1 = 10.0, d2 = 20.5; Add<int>(a1, d2);//在這個(gè)地方前面加<int>,計(jì)算機(jī)就會(huì)默認(rèn)T為int型 }
第二種顯式實(shí)例化:在函數(shù)名后的<>中指定模板參數(shù)的實(shí)際類型
#include<iostream> using namespace std; template<class T> T Add(const T& left, const T& right) { return left + right; } int main() { int a1 = 10, a2 = 20; double d1 = 10.0, d2 = 20.5; Add(a1,(int) d2);//此處d2原本是double型,但是我們強(qiáng)制轉(zhuǎn)換為int之后,兩者的類型都相同,計(jì)算機(jī)就能自動(dòng)推導(dǎo)了 }
到此這篇關(guān)于C++超詳細(xì)介紹模板的文章就介紹到這了,更多相關(guān)C++模板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(68.文本左右對(duì)齊)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(68.文本左右對(duì)齊),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++中g(shù)etline()、gets()等函數(shù)的用法詳解
這篇文章主要介紹了C++中g(shù)etline()、gets()等函數(shù)的用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)順序表中的增刪改(頭插頭刪)教程示例詳解
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)順序表中增刪改關(guān)于頭插頭刪的教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02opencv配置的完整步驟(win10+VS2015+OpenCV3.1.0)
OpenCV是計(jì)算機(jī)視覺中經(jīng)典的專用庫(kù),其支持多語(yǔ)言、跨平臺(tái),功能強(qiáng)大,這篇文章主要給大家介紹了關(guān)于opencv配置(win10+VS2015+OpenCV3.1.0)的相關(guān)資料,需要的朋友可以參考下2021-06-06C語(yǔ)言實(shí)現(xiàn)的程序員老黃歷實(shí)例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的程序員老黃歷,涉及日期的判定及流程控制的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07c 調(diào)用python出現(xiàn)異常的原因分析
本篇文章是對(duì)使用c語(yǔ)言調(diào)用python出現(xiàn)異常的原因進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言掃雷詳細(xì)代碼分步實(shí)現(xiàn)流程
掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來詳解每一步分析2022-02-02