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