第六章-template模板
第六章-template模板
文章目錄
- 第六章-template模板
- 函數(shù)模板
- 類模板
函數(shù)模板
函數(shù)模板可以用來創(chuàng)建一個(gè)通用功能的函數(shù),以支持多種不同形參,進(jìn)一步簡(jiǎn)化重載函數(shù)的函數(shù)體設(shè)計(jì)
函數(shù)定義的一般形式:
template <模板參數(shù)表> 類型名 函數(shù)名(參數(shù)表) {函數(shù)體定義 }模板參數(shù)表由用逗號(hào)分隔的模板參數(shù)構(gòu)成,用 class 或者 typename來指明可以接受一個(gè)類型參數(shù)
template <typename T> //這里也可以寫成 template <class T> T abs(T x) {return x < 0 ? -x : x; } int main(){int n=-5;double m=-3.3;cout<<abs(n)<<endl;cout<<abs(m)<<endl;return 0; } /* 程序運(yùn)行的結(jié)果為:53.3 */類型參數(shù)的含義確定后,編譯器以函數(shù)模板為樣板,生成一個(gè)函數(shù),這一過程稱為函數(shù)模板的實(shí)例化,該函數(shù)稱為函數(shù)模板的一個(gè)實(shí)例
如果調(diào)用 abs函數(shù)時(shí)傳入的參數(shù)為int,則運(yùn)行時(shí)會(huì)生成一個(gè)int類型的實(shí)例函數(shù),如果傳入?yún)?shù)為double,則生成double類型的實(shí)例函數(shù)
細(xì)節(jié):
類模板
使用類模板可以讓用戶定義類的一種模式,使類中某些數(shù)據(jù)成員、某些函數(shù)成員的參數(shù)、返回值或局部變量能取任意類型
類模板需要一種或多種類型參數(shù),因此也可以叫做參數(shù)化類
類模板聲明的語法形式:
template <模板參數(shù)表> class 類名 {類成員聲明} //模板參數(shù)表形式和函數(shù)模板的一樣 //類成員聲明方法和普通類的定義相同,只是它的各個(gè)成員可以使用模板類型中的參數(shù)T如果需要在類模板以外定義其成員函數(shù),采用以下形式:
template <模板參數(shù)表> 類型名 類名<模板參數(shù)標(biāo)識(shí)符列表>::函數(shù)名(參數(shù)表)使用一個(gè)模板類來建立對(duì)象時(shí),采用以下形式:
模板名<模板參數(shù)表>對(duì)象名1,···,對(duì)象名N; template<class T> //類模板,實(shí)現(xiàn)對(duì)任意類型的數(shù)據(jù)進(jìn)行存取 class Store{ public:Store(){haveValue=false; //默認(rèn)為 false }T &getElem(); //提取數(shù)據(jù)函數(shù) void putElem(T x); //存入數(shù)據(jù)函數(shù) private:T item; //item用于存放任意類型的數(shù)據(jù) bool haveValue; //haveValue用來判斷 item是否存取 };template<class T> T &Store<T>::getElem(){if(!haveValue){ //如果試圖提取未初始化的數(shù)據(jù),則終止程序 cout<<"NO item present!"<<endl;exit(1);}return item; //提取成功,則返回item中存取的數(shù)據(jù) }template<class T> void Store<T>::putElem(T x){item=x;haveValue=true; //表示item中已經(jīng)存入數(shù)據(jù) }int main(){Store<int>s1,s2; //定義兩個(gè)Store<int>對(duì)象 s1.putElem(3);s2.putElem(-7);cout<<s1.getElem()<<" "<<s2.getElem()<<endl;Store<double>s3,s4; //定義兩個(gè)Store<double>對(duì)象 s3.putElem(4.3);s4.putElem(-9.2);cout<<s3.getElem()<<" "<<s4.getElem()<<endl;Store<int>s5;cout<<s5.getElem()<<endl; //數(shù)據(jù)沒有初始化,進(jìn)行異常處理 return 0; } /* 程序運(yùn)行的結(jié)果為:3 -74.3 -9.2 NO item present! */一個(gè)類模板聲明自身并不是一個(gè)類,而是說明了類的一個(gè)家族。只有被其他代碼引用時(shí),模板才根據(jù)引用的需要生成具體的類
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的第六章-template模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。