函數模板,顧名思義,是在生成函數時依照的模板。函數
有時,咱們須要對不一樣的數據類型作一樣的函數操做。spa
好比:分別對一個int類型數 和 一個double類型數求平方。設計
這時,雖然都是一樣的求平方操做(函數體內代碼同樣),可是咱們必需要編寫兩個不一樣的函數,由於處理int類型的函數的參數和返回值類型都應該是int,而處理double類型的函數的參數和返回值都應該是double。指針
以下:函數體內操做代碼同樣,設計爲重載函數,用相同的函數名,可是參數類型和返回值類型卻都不同,函數須要定義兩次。code
int Square(int a) //求int類型變量的平方值 {
int b;b=a*a; return b; } double Square(doublea) //求double類型變量的平方值 {
double b;b=a*a; return b; }
此時,若是使用函數模板就能夠省去屢次重複定義函數的麻煩,消除冗餘代碼 ,提高代碼重用性。對象
函數模板的定義形式:blog
template<模板參數表>get
類型名 函數名 (參數表)編譯器
{編譯
函數體定義
}
對於模板參數表:由 「class」或「typename 」加上 「類型說明符」 組成。(模板參數表還能夠爲「template<參數表>class」 加上 「類型說明符」,表示接收一個類模板做爲參數,關於類模板的說明在後面)
模板參數表 用來指定函數模板的形參類型、返回值類型以及函數中的局部變量類型。
如以上Square函數的函數模板以下:
template<typename T> T Square(T a) {
T b;b=a*a; return b; }
此時,再分別計算int類型和double類型變量的平方時,咱們再也不須要手動書寫兩個函數,只需按以下方式執行便可。
int main() { int m=2; double n= 3.0; cout<<Square(m)<<endl; couta<<Square(n)<<endl; return 0; }
在上述Square()被調用時,編譯器從實參的類型(如int)推導出函數模板的參數類型(int),而後編譯器將依據函數模板來生成一個以下函數:
(在調用Square(m)時,執行的函數其實是int Square(int a)這個函數,同理調用Square(n)時,實際上執行的是double Square(double a)。)
int Square(int a) { int b;b=a*a; return b; }
這一個過程咱們稱之爲,函數模板的實例化。函數模板實例化的過程用戶是不用關心的。
關於函數模板有幾點須要注意:
1.函數模板自己在編譯時不會生成任何目標代碼,只有函數模板生成的實例才生成目標代碼。
2.若是函數模板被多個文件引用,函數模板的函數體也應該放在頭文件裏,而不能只放函數模板的聲明。
3.函數指針不能指向函數模板自己,只能指向函數模板的實例。
類模板,與函數模板相似,是生成類時依照的模板。
類模板聲明語法格式:
template<模板參數表>
class 類名
{
類成員聲明
}
同理,模板參數表用於影響類成員(函數成員及數據成員)的中的數據類型。
例:
template<class T> class printer{ //一個打印機類模板,能夠接收並打印給定數據類型 private: T a; bool b; //用來標記是否有可給出內容 public: T& prin(); //給出要打印內容 void get(const T& x); //得到要打印內容 };
在類模板外定義其函數成員的格式以下:
template<模板參數表>
類型名 類名<模板參數標識符列表>::函數名(參數表)
對應上述類模板有:
template<class T> T& printer<T>::prin(){ if(b) return a; } template<class T> void printer<T>::get(const T& x){ a=x; b=true; }
類模板一樣擁有實例化的過程。
使用一個類模板來創建對象方法:
模板名<模板參數表>對象名1,對象名2,...,對象名n;
創建對象的過程:首先模板實例化生成具體的類,而後類再實例化出一個個對象。
如 printer<int>p1,p2; 創建了兩個能夠得到並給出int類型數據的打印機p1和p2。
int main(){ printer<int>p1,p2; p1.get(1); p2.get(2); cout<<"p1要打印的是"<<p1.prin()<<endl; cout<<"p2要打印的是"<<p2.prin()<<endl; return 0; }
經過模板能夠實現參數化多態性(就是將處理的對象的類型參數化,使得一段程序能夠處理不一樣類型的對象)。
以上。